Regex sed对于正则表达式失败

Regex sed对于正则表达式失败,regex,sed,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 ref

我有一个类似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

为什么它不起作用,我如何修复它?

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

问题似乎是正则表达式中的内容类似于
\([0-9]+\)
。这里您正在转义
,因此它实际上不是一个捕获组,因此不能被引用回来


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

您正在逃离
()
<代码>\(与
非常不同

转义时,
\(
),它将匹配字符串中的文本“
”。捕获组使用
()
,但不能转义

因此,您没有捕获组,因此返回引用捕获组3时出错,因为它不存在

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


更有效的正则表达式 您的正则表达式效率很低。它可以缩短为:

\d+,(\d+),\d+,(\d+),\d+,(\d+).*
# VS #
[0-9]+,([0-9]+),[0-9]+,([0-9]+),[0-9]+,([0-9]+).*
您可以使用相同的替换语句

之所以这样做,是因为
\d
是一种书写
[0-9]
的速记方法,它比
[0-9]
短3位数(考虑到您书写
[0-9]
的次数,这节省了大量空间)


我会使用
awk

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

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

@Shafizadeh谢谢!请注意
vs
\(
仅适用于您使用的是
-r
。如果没有
-r
,则含义相反。每个工具对正则表达式语法的理解略有不同-在
sed
的情况下,您可以从多个不同的语法中进行选择。因此,请小心。在缩短的v中是
\d'还是
\d+`ersion?@Grzenio好吧,如果数字可以是两位数,
\d+
。谢谢,我会更新答案!尽管一些在线工具可能认为是有效的regexp,但没有任何版本的sed会将
\d
解释为“一位数”请注意@MarkReed的评论,因为它在使用sed时非常重要。如果您想使解决方案更简洁,请使用
([0-9]+,([0-9]+),{2}[0-9]+,([0-9]+).
这是一位同事的建议,它显然是有效的。我想弄清楚为什么这个sed命令不起作用。正如其他人所说,使用
\(…\)
或将
-r
传递给sed
awk -F, '{printf "A:%s/B:%s/C:%s\n", $2, $4, $6}' file