我尝试使用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
会回复此错误,以及如何修复它?感谢。
答案 0 :(得分:1)
默认情况下,根据POSIX spec,sed
使用基本正则表达式(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}
)。