用sed递归替换文本

时间:2017-05-13 02:38:16

标签: bash sed xargs

我想使用'use strict'; var express = require('express'); var path = require('path'); var app = express(); app.get('/', function (req, res) { res.sendFile(path.join(__dirname+'/index.html')); }); app.get('/search', function(req,res){ res.send('search route'); }); app.get('/search/*', function(req, res, next) { res.setHeader('content-type', 'plain/text'); var type = typeof(res); var reqParams = req.params; res.send(type); }); var server = app.listen(process.env.PORT || 3000, function(){ console.log('app listening on port ' + process.env.PORT + '!'); }); module.exports = server; 替换完整源文件树中特定文本的每个出现。我尝试过以下方法: sed但它似乎无法正常工作,我认为我的sed cmd不正确。
我该怎么做?

问题是,替换不会发生。

我尝试了这个:$ grep -rlI name2port\(\"Wan1\"\) . --exclude-dir=.svn --exclude=*.vxs | xargs sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g'但事实证明,$ sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c的出现不会被替换。

1 个答案:

答案 0 :(得分:3)

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

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

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

"

如果您不关心可移植性,可以使用sed -i 's/name2port("Wan1")/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c (或-r有限的可移植性用于macOS,但{ {1}}不起作用),然后启用ERE(扩展正则表达式),其语法和功能更有可能按预期工作

-E

请注意文字-ised -r -i 's/name2port\("Wan1"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 现在需要( - 转义,以免被解释为包含捕获组。

在这种特殊情况下,BRE比ERE需要更少的逃逸;但总的来说,情况正好相反。