Regex 如何在vim中翻译正则表达式以使用sed?

Regex 如何在vim中翻译正则表达式以使用sed?,regex,vim,sed,Regex,Vim,Sed,我有一个字符串,它存在于我试图用正则表达式修改的文本文件中 "configuration_file_for_wks_33-40" 我想修改它,使它看起来像这样 "configuration_file_for_wks_33-40_6ks" 在vim中,我可以通过以下regex命令来完成这一点 %s/33-\(\d\d\)/33-\1_6ks/ 但是如果我试图将regex命令传递给sed,比如 sed 's/33-\(\d\d\)/33-\1_6ks/

我有一个字符串,它存在于我试图用正则表达式修改的文本文件中

"configuration_file_for_wks_33-40"
我想修改它,使它看起来像这样

"configuration_file_for_wks_33-40_6ks"
在vim中,我可以通过以下regex命令来完成这一点

%s/33-\(\d\d\)/33-\1_6ks/ 
但是如果我试图将regex命令传递给sed,比如

sed 's/33-\(\d\d\)/33-\1_6ks/' input_file.json
即使包含-e参数,字符串也不会更改

我也尝试过使用ex作为

echo '%s/33-\(\d\d\)/33-\1_6ks/' | ex input_file.json
如果我使用

sed  's/wks_33-\(\d\d\)*/wks_33-\1_6ks/' input_file.json
然后我得到

configuration_file_for_wks_33-_6ks40
为此,我尝试了各种不同的逃逸模式,但没有任何运气

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

如何在vim中翻译正则表达式以使用sed

既然你写了“正则表达式”,我想你指的是任何正则表达式


因此,将Vim正则表达式转换为Sed正则表达式并不总是可能的,因为Vim正则表达式可以有lookarounds,而Sed正则表达式没有lookarounds。

Vim对正则表达式有不同的语法(甚至可以配置)。不幸的是,sed不理解
\d
(请参阅)。使用
-E
,您可以将数字与
[0-9]
[[:digit:][]

$ sed -E 's/33-[0-9][0-9]/&_6ks/'
configuration_file_for_wks_33-40_6ks
请注意,您可以在替换中使用
&
来添加整个匹配字符串

那么,这是为什么:

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

在这里,
(\d\d)*
只匹配了0次,因此您将
wks\U 33-
替换为
wks\U 33-\U 6ks
\1
是一个零长度字符串),
40
保持原来的状态。

从一种语言到另一种语言的翻译最好是使用手头的参考资料:

从表面上看,
sed
不支持
\d

\d\d
的可能替代方案:

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

Sed不支持
\d
。您必须改用
[[:digit:]