regex - 我如何在 vim 中翻译正则表达式以与 sed 一起工作?

我有一个文本文件中存在的字符串,我正在尝试使用正则表达式对其进行修改。

"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/

相关文章:

python - Pandas 按行添加另一列

generics - 如何使通用形式参数别名

Python - 用于从文本中获取特定行的正则表达式

android - 身份验证失败 : com. microsoft.identity.client.

rust - Rust 中枚举的展平向量

rust - 如何结合 `Ord::cmp()`中的两个cmp条件

python - For 循环得到错误说 (odd number - odd number)/2 i

nlp - 如何为 T5 模型使用 forward() 方法而不是 model.generate()

r - 按组计算数据框中出现的连续月份

ios - matchedGeometryEffect 动画效果不流畅