sed取代点点斜线,但是s s斜线得到了替换

时间:2015-08-01 17:35:51

标签: regex sed

操作系统:Debian Jessie 64
sed(GNU sed)4.2.2

我必须将我的路径从../替换为../../
测试文件。

$ cat dot.js 
path = '../'

我在斜线前加上反斜杠以加入单引号:

sed -i 's/..\//..\/..\//g' dot.js

输出:

path = '../../'

但是,当我使用我的实际文件时。

$ cat dotdot.js 
var real_questionHandler = require('../routes/questionHandler_delqid.js');
var questionHandler_delqid = proxyquire('../routes/questionHandler_delqid.js', { 'pg' : pgStub} );

输出:

var real_questionHandler = require('../../rout../../questionHandler_delqid.js');
var questionHandler_delqid = proxyquire('../../rout../../questionHandler_delqid.js', { 'pg' : pgStub} );

如何保护每条线的第二个位置免受替换?

1 个答案:

答案 0 :(得分:4)

您需要转义所有点以使其与文字点字符匹配,否则,未转义的点将匹配任何字符。这样你的正则表达式就匹配../以及es/

sed -i 's/\.\.\//..\/..\//g' dot.js

sed -i 's~\.\./~../../~g' dot.js

示例:

$ echo "require('../routes/questionHandler_delqid.js');" | sed 's~\.\./~../../~g'
require('../../routes/questionHandler_delqid.js');