sed切换第一个和最后一个单词的顺序

B.M*_*.W. 4 regex sed

我试图使用sed切换句子中第一个和最后一个单词的顺序,因为我不认为我理解在这种情况下"贪婪"的正则表达式是多少.我只是因为三个字的句子而悲惨地失败了.

$ echo hello world mike | sed 's/\([a-z]*\).* \([a-z]*\).*/\2 \1/'
mike hello
Run Code Online (Sandbox Code Playgroud)

为什么输出不是"世界你好迈克"?一些可能有用的额外信息.

  1. \ 1\2是第一个和第二个正则表达式匹配

  2. 我在这里按照教程.

我的最终目标是切换句子中第一个和最后一个单词的顺序,而不管其中有多少单词.

Car*_*rum 7

您没有将该hello部件作为捕获组之一包含在内,因此无法获得输出.尝试:

$ sed -E 's/([a-z]+) (.+) ([a-z]+)/\3 \2 \1/' <<< "hello world mike"
mike world hello
$ sed -E 's/([a-z]+) (.+) ([a-z]+)/\3 \2 \1/' <<< "hello world foo bar baz mike"
mike world foo bar baz hello
Run Code Online (Sandbox Code Playgroud)

(注意:我也删除了你无用的回声.)

您也可以替换[a-z]with [[:alpha:]]来处理大写字母:

$ sed -E 's/([[:alpha:]]+) (.+) ([[:alpha:]]+)/\3 \2 \1/' <<< "Hello world Mike"
Mike world Hello
Run Code Online (Sandbox Code Playgroud)