正则表达式匹配有或没有尾巴后某个字符

问题描述 投票:2回答:2

我希望最终匹配带有或不带冗余字符串的规则。并交换匹配模式。 例:

$ "aaa bbb ccc" --> "bbb aaa"
$ "aaa bbb" --> "bbb aaa"

这是我尝试但不起作用的。

echo "aaa bbb ccc" | sed -e 's:\(.*\)\s\(.*\)(\s\(.*\))?:\2\s\1:g'
$ aaa bbb ccc

谢谢。

regex shell
2个回答
2
投票

Using sed

尝试:

$ echo "aaa bbb" | sed -Ee 's:([[:alnum:]]+)[[:space:]]+([[:alnum:]]+).*:\2 \1:'
bbb aaa
$ echo "aaa bbb ccc" | sed -Ee 's:([[:alnum:]]+)[[:space:]]+([[:alnum:]]+).*:\2 \1:'
bbb aaa

笔记:

  1. sed识别POSIX正则表达式。 \s是GNU唯一的扩展。 sed的所有实现都理解像[[:space:]][[:alnum:]]这样的字符类。
  2. 我添加了选项-E来获取扩展的正则表达式。这消除了对反斜杠的需要,并且还使得使用+表示一个或多个。
  3. 在您想要交换的单词之后,无需匹配部分行。

Using bash

$ read a b c<<<"aaa bbb"; echo "$b $a"
bbb aaa
$ read a b c<<<"aaa bbb ccc"; echo "$b $a"
bbb aaa

Using awk

$ echo "aaa bbb" | awk '{print $2,$1}'
bbb aaa
$ echo "aaa bbb ccc" | awk '{print $2,$1}'
bbb aaa

0
投票

awk解决方案:

echo aaa bbb | awk '{print $2" "$1}'
echo aaa bbb ccc | awk '{print $2" "$1}'

它的作用是以相反的顺序打印第一个和第二个字段而忽略其余的行:元素由FS的默认awk标识,可以根据您的需要进行调整

enter image description here

希望它能帮到你!

© www.soinside.com 2019 - 2024. All rights reserved.