0

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

这是我尝试过的:

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

我究竟做错了什么?

4

5 回答 5

0

我开始使用\s这意味着任何空格字符。
我用它来匹配每个[^\s]*匹配所有内容但不匹配空格的单词。
我有\s*匹配单词之间的空格。并且不要忘记重写替换空间。

以这个为例:

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

(我用#代替/

于 2013-03-30T19:06:30.840 回答
0

尝试这个:

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

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

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

\s 表示空格

于 2013-03-30T19:39:36.737 回答
0

这可能对您有用(GNU sed):

sed -r 's/(\S+)\s+(\S+)\s+(\S+)/\3 \2 \1/' file 
于 2013-03-31T13:57:02.373 回答
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
于 2013-03-30T20:31:33.580 回答
-1

您没有考虑空格。

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

于 2013-03-30T18:48:51.080 回答