如何使用sed去重新排列由逗号分隔的string中的子串组?
例如,
你好鲍勃,我的名字是,约瑟夫
变为:
约瑟夫,我的名字是,你好鲍勃
以此作为测试文件:
$ cat file hello bob, my name is, joseph
我们可以按照您的喜好重新排序字段:
$ sed -E 's/([^,]*), *([^,]*), *([^,]*)/\3, \2, \1/' file joseph, my name is, hello bob
一个sed
替换命令的形式s/old/new/
。 这是old
替换old
是一个正则表达式。 在这种情况下, old
:
([^,]*), *([^,]*), *([^,]*)
parens中的项目是组。 这将行分隔成三个逗号分隔的组。 我们可以把这三个分别称为“ \1
,“ \2
”和“ \3
。 在new
文本中,我们使用:
\3, \2, \1
这反过来,按照你的要求排列第三和第一个。
如果我们想要颠倒所有的子串,但是子串的数量是未知的,那么awk
是一个很好的工具:
$ awk -F', *' '{for (i=NF;i>0;i--)printf "%s%s",$i,(i>1?", ":"\n")}' file joseph, my name is, hello bob
-F', *'
表示我们希望使用一个逗号(可选地跟随空格)作为字段分隔符。
for (i=NF;i>0;i--)printf "%s%s",$i,(i>1?", ":"\n")
在每个字段上反向循环并打印,或者最后一个换行符。
下面是一个反转子字符串中的单词的例子:
$ sed -E 's/([^ ,]*) ([^,]*), /\2 \1, /' file bob hello, my name is, joseph
这是一个颠倒子字符串中的单词的例子,同时也颠倒了子串的顺序:
$ sed -E 's/([^ ,]*) ([^,]*), *([^,]*), *([^,]*)/\4, \3, \2 \1/' file joseph, my name is, bob hello
你也可以使用awk :
awk -F', ' '{ print $3 ", " $2 ", " $1 }' <<< "hello bob, my name is, joseph" #joseph, my name is, hello bob
更新:
基于@ andlrc的评论,这个解决方案更简单:
awk 'BEGIN{FS=OFS=", "}{print $3, $2, $1}' <<< "hello bob, my name is, joseph"