bash - 用 sed 递归替换文本

标签 bash sed xargs

我想使用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") 的出现不会被替换。

最佳答案

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

在 BRE 中,()普通(文字)字符,并且仅在 \-转义。

因此,要匹配文字 name2port("Wan1"),请在 BRE 中按原样使用该文字(假设您也不需要 \-转义 " 实例):

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 不起作用),然后启用 ERE(扩展正则表达式),其语法和功能更可能按照您的预期工作:

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

请注意文字 () 现在 do 需要进行 \ 转义,以免它们被解释作为封闭捕获组。

在这种特殊情况下,BRE 比 ERE 需要更少的转义;但一般来说,情况恰恰相反。

关于bash - 用 sed 递归替换文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43948678/

相关文章:

linux - 如何从第二行使用 awk '{print $1*Number}' 或告诉他忽略 NaN 值?

xml - 使用 xmllint 返回多个结果

regex - 如何在某些范围内使用 sed delete Unicode?

bash - 如何匹配sed中的单引号

使用 grep 进行正则表达式格式化

linux - 显示父目录中文件的内容

bash - 在一个命令中通过 xargs 传送两个文件名(带空格)

linux - Bash 脚本 tee 命令语法问题

linux - 为什么在我的 .bashrc 中使用 `uname` 时出现错误?

linux bash命令以空格分隔