【问题标题】:How can I translate a regex within vim to work with sed?如何在 vim 中翻译正则表达式以使用 sed?
【发布时间】:2021-07-23 02:14:35
【问题描述】:

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

"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

为此,我尝试了各种不同的转义模式,但没有任何运气。

谁能帮我理解为什么这些更改不起作用?

【问题讨论】:

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

标签: regex vim sed


【解决方案1】:

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 保持原来的位置。

【讨论】:

    【解决方案2】:

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

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

    将 Vim 正则表达式转换为 Sed 正则表达式并不总是可行的,因为 Vim 正则表达式可以有环视,而 Sed 正则表达式没有这样的东西。

    【讨论】:

      【解决方案3】:

      从一种语言翻译成另一种语言最好使用一些参考资料:

      其中的肤浅解读表明sed不支持\d

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-25
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 2011-04-23
        相关资源
        最近更新 更多