如何在vim中翻译regex以使用sed

  • 本文关键字:sed regex 翻译 vim regex vim sed
  • 更新时间 :
  • 英文 :


我有一个字符串存在于我试图用regex修改的文本文件中。

"configuration_file_for_wks_33-40"

我想修改它,使它看起来像这个

"configuration_file_for_wks_33-40_6ks"

在vim中,我可以使用以下regex命令来实现这一点

%s/33-(dd)/33-1_6ks/ 

但是,如果我试图将regex命令传递给sed,例如

sed 's/33-(dd)/33-1_6ks/' input_file.json

即使我包含-e参数,字符串也不会更改。

我也尝试过使用ex作为来做这件事

echo '%s/33-(dd)/33-1_6ks/' | ex input_file.json

如果我使用

sed  's/wks_33-(dd)*/wks_33-1_6ks/' input_file.json

然后我得到

configuration_file_for_wks_33-_6ks40

为此,我尝试了各种不同的逃跑模式,但没有任何运气。

有人能帮我理解为什么这些改变不起作用吗?

vim对正则表达式有不同的语法(甚至是可配置的(。不幸的是,sed不理解d(请参阅https://unix.stackexchange.com/a/414230/304256)。使用-E,您可以将数字与[0-9][[:digit:]]:匹配

$ sed -E 's/33-[0-9][0-9]/&_6ks/'
configuration_file_for_wks_33-40_6ks

请注意,您可以在替换中使用&来添加整个匹配的字符串。

那么为什么是这样:

$ sed  's/wks_33-(dd)*/wks_33-1_6ks/' input_file.json
configuration_file_for_wks_33-_6ks40

这里,(dd)*只匹配了0次,所以用wks_33-_6ks替换wks_33-(1是一个零长度的字符串(,40保持原来的位置。

从一种语言到另一种语言的翻译最好有一些参考资料:

  • sedBRE语法
  • sed ERE语法
  • sed
  • sed RE扩展

从表面上看,sed不支持d

dd:的可能替代品

[[:digit:]]{2}
[0-9]{2}

如何在vim中翻译regex以使用sed?

因为你写了">aregex";,我想你指的是任何正则表达式。

将Vim regex转换为Sed regex并不总是可能的,因为Vim regex可以具有查找功能,而Sed regex则没有这样的功能。

最新更新