我有一个类似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
为什么它不起作用,我该如何解决?
答案 0 :(得分:2)
使用-r
,正则表达式使用“扩展”语法,在该语法下不应引用捕获括号。
答案 1 :(得分:2)
您正在逃离()
。 \(
与(
非常不同。
转义时\(
,它将与文字" (
"匹配。在字符串中。捕获组使用()
,但不得对其进行转义。
因此,您没有捕获组,因此有一个错误反向参考Capture Group#3,因为它不存在。
您应该将此\([0-9]+\)
更改为此([0-9]+)
:
[0-9]+,([0-9]+),[0-9]+,([0-9]+),[0-9]+,([0-9]+).*
你的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]
,这节省了空间的批次
答案 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+)
。