【问题标题】:recursively replace text with sed用 sed 递归替换文本
【发布时间】:2017-05-13 11:22:15
【问题描述】:

我想使用sed 替换完整源文件树中特定文本的每次出现。我尝试了以下方法: $ grep -rlI name2port\(\"Wan1\"\) . --exclude-dir=.svn --exclude=*.vxs | xargs sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' 但它似乎不起作用,我认为我的 sed cmd 不正确。
我该怎么做?

问题是,替换只是没有发生。

我试过这个:$ sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 但事实证明,name2port("Wan1") 的出现不会被替换。

【问题讨论】:

    标签: bash sed xargs


    【解决方案1】:

    sed 默认使用 BRE(基本 正则表达式),由于历史原因 - 并且对于习惯于现代正则表达式的人来说令人惊讶 - 需要 某些元字符转义以便被识别。

    在 BRE 中,()普通(字面)字符,只有在 \-转义时才变得特殊。

    因此,要匹配文字 name2port("Wan1"),请在 BRE 中使用该文字 as-is(假设您也不需要 \-escape " 实例):

    sed -i 's/name2port("Wan1")/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c
    

    如果您不关心可移植性,您可以使用-r(或-E 用于有限 macOS 的可移植性,但使用-i 会胜出't work),然后启用 ERE(扩展正则表达式),其语法和功能更有可能按您的预期工作

    sed -r -i 's/name2port\("Wan1"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c
    

    注意文字 () 现在确实需要被 \-转义,以免它们被解释为包含捕获组。

    在这种特殊情况下,BRE 比 ERE 需要更少的转义;但是,通常情况正好相反。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2011-12-22
      • 2011-11-25
      • 2022-10-21
      • 2012-10-14
      • 2020-02-27
      相关资源
      最近更新 更多