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

时间:2017-12-29 04:48:30

标签: regex shell

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

$ "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

谢谢。

2 个答案:

答案 0 :(得分:2)

使用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. 您无需在要交换的字词后匹配部分内容。

  4. 使用bash

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

    使用awk

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

答案 1 :(得分:0)

awk 解决方案:

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

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

enter image description here

希望它可以帮到你!