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

Ubuntu 在Linux中使用sed交换两个单词,ubuntu,sed,Ubuntu,Sed,伙计们!我试着在一行中交换两个单词,但不起作用。例如:“今天是我上大学的第一天”应该是“今天是我上大学的第一天” 这就是我所尝试的: sed 's/\([a-zA-z0-9]*\)\([a-zA-z0-9]*\)\([a-zA-z0-9]*\)/\3\2\1/' filename.txt 我做错了什么?您没有考虑空格 在单词之间使用[\t]+。我开始使用\s来表示任何空格字符。 我用它来匹配所有与所有内容匹配但不与空格匹配的[^\s]*。 我有\s*来匹配单词之间的空格。别忘了重写一个空格作为

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

这就是我所尝试的:

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

我做错了什么?

您没有考虑空格


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

我开始使用
\s
来表示任何空格字符。
我用它来匹配所有与所有内容匹配但不与空格匹配的
[^\s]*

我有
\s*
来匹配单词之间的空格。别忘了重写一个空格作为替代

请看下面的示例:

sed 's#\([^ ]*\)\s+#\1 #'
(我用
代替
/

试试这个:

sed -rn 's/(\w+\s)(\w+\s)(\w+\s)(.*)/\3\2\1\4/p' filename.txt
-n抑制图案空间的自动打印

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

\s代表空格

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的/([a-zA-z0-9]*)[\t]+([a-zA-z0-9]*)[\t]+([a-zA-z0-9]*)/\3\2\1/'filename.txt无效!:(需要转义
+
sed的/\([a-zA-z0-9]*\)[\t]\+\([a-zA-z0-9]*\)[\t]\+\([a-zA-z0-9]*\)/\3\2\1/'filename.txt
我想这会教我不要回答得太快。最终的答案是您没有考虑原始搜索字符串中的空格。\w+是我所想的。感谢您的更正。您应该使用另一个分隔符,如
的35; pat#repl#
,以获得更清晰的命令。您需要要使用1或多个字符而不是零或多个字符,否则如果句子以空格开头,您将匹配空字符串和第一个空格。您需要使用1或多个字符而不是零或多个字符,否则如果句子以空格开头,它将匹配空字符串和第一个空格。例如,GNU-sed版本可能较短通过删除
(.*)
\4
sed -r 's/(\S+)\s+(\S+)\s+(\S+)/\3 \2 \1/' file