如何使用 sed 重新排序以逗号分隔的字符串中的子串组?
例如,
你好鲍勃,我的名字是,约瑟夫
变为:
约瑟夫,我的名字是,你好鲍勃
答案 0 :(得分:2)
将此作为测试文件:
$ 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
替换为new
,其中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
答案 1 :(得分:0)
您还可以使用awk:
$ python -m timeit '"".join(reversed("abcdefghijklmnopqrstuvwxyz"))'
1000000 loops, best of 3: 0.586 usec per loop
$ python -m timeit '"abcdefghijklmnopqrstuvwxyz"[::-1]'
10000000 loops, best of 3: 0.0715 usec per loop
<强>更新强>
基于@andlrc's评论,此解决方案更简单:
awk -F', ' '{ print $3 ", " $2 ", " $1 }' <<< "hello bob, my name is, joseph"
#joseph, my name is, hello bob