sed因正则表达式而失败

时间:2016-03-31 15:36:02

标签: regex sed

我有一个类似CSV的格式化文件,例如:

1,2,3,4,5,6,7,8
2,3,4,5,6,7,8,9

我正在尝试重新格式化以获得:

A:2/B:4/C:6
A:3/B:5/C:7

所以我写了一个小sed脚本:

sed -r 's/[0-9]+,\([0-9]+\),[0-9]+,\([0-9]+\),[0-9]+,\([0-9]+\).*/A:\1\/B:\2\/C:\3/'

但它报告错误:

sed: -e expression #1, char 92: invalid reference \3 on `s' command's RHS

为什么它不起作用,我该如何解决?

4 个答案:

答案 0 :(得分:2)

使用-r,正则表达式使用“扩展”语法,在该语法下不应引用捕获括号。

答案 1 :(得分:2)

您正在逃离()\((非常不同。

转义时\(,它将与文字" ("匹配。在字符串中。捕获组使用(),但不得对其进行转义。

因此,您没有捕获组,因此有一个错误反向参考Capture Group#3,因为它不存在。

您应该将此\([0-9]+\)更改为此([0-9]+)

[0-9]+,([0-9]+),[0-9]+,([0-9]+),[0-9]+,([0-9]+).*

Live Demo on Regex101

更高效的RegEx

你的RegEx效率很低。它可以缩写为:

\d+,(\d+),\d+,(\d+),\d+,(\d+).*
# VS #
[0-9]+,([0-9]+),[0-9]+,([0-9]+),[0-9]+,([0-9]+).*

你可以使用相同的替代声明。

这可行的原因是因为\d是写[0-9]的简写方法,它会缩短3个数字(并考虑您编写的次数[0-9] ,这节省了空间的批次

Live Demo on Regex101

答案 2 :(得分:2)

我会使用awk

awk -F, '{printf "A:%s/B:%s/C:%s\n", $2, $4, $6}' file

使用-F,允许指定字段分隔符并用逗号分隔输入行。 printf按照您的意愿重新组合输出。

答案 3 :(得分:1)

问题似乎是像\([0-9]+\)这样的正则表达式中的内容。在这里,您要转义(),因此它实际上不是捕获组,因此无法返回。

尝试([0-9]+)(\d+)