我想使用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/