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:]
。