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

时间:2013-03-30 18:43:08

标签: ubuntu sed

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

这就是我的尝试:

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

我做错了什么?

5 个答案:

答案 0 :(得分:1)

试试这个:

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

-n禁止自动打印图案空间

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

\ s用于空白

答案 1 :(得分:0)

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

看一下这个例子:

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

(我使用#代替/

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这可能适合你(GNU sed):

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

答案 4 :(得分:-1)

你没有考虑空白。

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