我有一个文本文件中存在的字符串,我正在尝试使用正则表达式对其进行修改。
"configuration_file_for_wks_33-40"
我想修改它,让它看起来像这样
"configuration_file_for_wks_33-40_6ks"
在 vim 中,我可以使用以下正则表达式命令完成此操作
%s/33-\(\d\d\)/33-\1_6ks/
但是如果我尝试将该正则表达式命令传递给 sed,例如
sed 's/33-\(\d\d\)/33-\1_6ks/' input_file.json
即使我包含 -e 参数,字符串也不会改变。
我也尝试过使用 ex as 来做到这一点
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 不理解 \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-\(\d\d\)*/wks_33-\1_6ks/' input_file.json
configuration_file_for_wks_33-_6ks40
这里,(\d\d)*
简单匹配了0次,所以将wks_33-
替换为wks_33-_6ks
(\1
是一个零长度字符串)并且 40
保持在原来的位置。
https://stackoverflow.com/questions/67321974/