使用sed提取字符串值

时间:2016-04-30 00:44:12

标签: regex string unix sed

如何使用 sed 重新排序以逗号分隔的字符串中的子串组?

例如,

你好鲍勃,我的名字是,约瑟夫

变为:

约瑟夫,我的名字是,你好鲍勃

2 个答案:

答案 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