Regex sed对于正则表达式失败
我有一个类似CSV格式的文件,例如: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
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