我有一个字符串存在于我试图用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
保持原来的位置。
从一种语言到另一种语言的翻译最好有一些参考资料:
sed
BRE语法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则没有这样的功能。