如何使用捕获的组转换这些行?

时间:2016-04-11 00:40:10

标签: regex linux bash unix sed

我尝试使用sed转换文件中的一堆文本,如下所示:

{ Interop.SecurityStatus.AlgorithmMismatch, SecurityStatusPalErrorCode.AlgorithmMismatch },
{ Interop.SecurityStatus.BadBinding, SecurityStatusPalErrorCode.BadBinding },
{ Interop.SecurityStatus.BufferNotEnough, SecurityStatusPalErrorCode.BufferNotEnough },
{ Interop.SecurityStatus.CannotInstall, SecurityStatusPalErrorCode.CannotInstall },

到此:

[Interop.SecurityStatus.AlgorithmMismatch] = SecurityStatusPalErrorCode.AlgorithmMismatch,
[Interop.SecurityStatus.BadBinding] = SecurityStatusPalErrorCode.BadBinding,
[Interop.SecurityStatus.BufferNotEnough] = SecurityStatusPalErrorCode.BufferNotEnough,
[Interop.SecurityStatus.CannotInstall] = SecurityStatusPalErrorCode.CannotInstall,

到目前为止,这是我尝试使用我的生锈的正则表达式知识来实现​​这一点:

$ sed -i 's/{ (.*), (.*) }/\[\1\] = \2/g' file_name

不幸的是,它似乎没有起作用,因为我从终端机上找回了这个错误:

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

我不确定为什么会发生这种情况,因为据我所知,我有2个括号(因此有2个被捕获的组)。有人可以向我解释为什么sed会回复此错误,以及如何修复它?感谢。

1 个答案:

答案 0 :(得分:1)

默认情况下,根据POSIX specsed使用基本正则表达式(BRE),其中(并且)普通字符,因此必须\ - 引用它们作为元字符才能按照您的意图创建捕获组(注意但是,{} 被视为普通字符,您 想要这样做:

sed -i 's/{ \(.*\), \(.*\) }/\[\1\] = \2/g' file_name

但是,鉴于您已经在使用非标准选项-i,您可以通过激活对扩展的支持来让您的生活更轻松GNU sed非标准-r选项的正则表达式(ERE);虽然在这种特殊情况下你没有从使用ERE中获得太多收益,但它们的功能通常会更像你期望的那样(从其他语言中可以看出):

sed -i -r 's/\{ (.*), (.*) \}/\[\1\] = \2/g' file_name

()现在按预期方式运行,但请注意现在{}需要\ - 引用为了被视为文字,因为在ERE的上下文中,它们是量词中使用的元字符(例如{1,2})。