在Linux中使用sed交换两个单词

伙计们! 我试图交换一行中的两个字,但它不起作用。 例如:“今天是我大学的第一天”应该是“我是今天大学的第一天”

这是我试过的:

sed 's/\([a-zA-z0-9]*\)\([a-zA-z0-9]*\)\([a-zA-z0-9]*\)/\3\2\1/' filename.txt 

我究竟做错了什么?

尝试这个:

 sed -rn 's/(\w+\s)(\w+\s)(\w+\s)(.*)/\3\2\1\4/p' filename.txt 

禁止自动打印图案空间

-r在脚本中使用扩展的正则表达式

\为空格

我开始用\s来表示任何空格字符。
我用它匹配每一个与[^\s]*单词匹配的一切,但不是空格。
而且我还有和单词之间的空格匹配。 不要忘记重写一个空间替代。

看看这个例子:

 sed 's#\([^ ]*\)\s+#\1 #' 

(我使用#而不是/

 sed -r 's/^(\w+)(\s+\w+\s+)(\w+)(.*)/\3\2\1\4/' 

用你的例子:

 kent$ echo "Today is my first day of university"|sed -r 's/^(\w+)(\s+\w+\s+)(\w+)(.*)/\3\2\1\4/' my is Today first day of university 

对于你的问题,awk更直截了当:

 awk '{t=$1;$1=$3;$3=t}1' 

同样的输入:

 kent$ echo "Today is my first day of university"|awk '{t=$1;$1=$3;$3=t}1' my is Today first day of university 

这可能适用于你(GNU sed):

 sed -r 's/(\S+)\s+(\S+)\s+(\S+)/\3 \2 \1/' file 

你不占空白。

在单词之间使用[\ t] +。