有效的RegEx与捕获组,但sed脚本不起作用

时间:2014-08-23 17:12:42

标签: regex bash sed capture-group

我有一个有效的RegEx模式,可以捕获三组字符串。我尝试在sed脚本中使用它来执行查找&替换操作,但我不断收到以下错误:

sed: -e expression #1, char 49: Unmatched ( or \(

我的脚本如下所示:

#!/usr/bin/env bash

pattern="^.*(require\(require\()(.+)(\);$)"
replace="require(\2;"
sed -i "s/$pattern/$replace/g" /usr/lib/node_modules/deployd/lib/type-loader.js

我尝试编辑的文件有一行显示:

var c = require(require('path').resolve(path) + '/node_modules/' + file);

......我想要的结果是:

var c = require('path').resolve(path) + '/node_modules/' + file;

我在此确认了我的RegEx:http://regex101.com/r/qO4jE5/1

...并在此处仔细检查:http://regexraptor.net/

知道我做错了吗?

3 个答案:

答案 0 :(得分:3)

普通sed使用BRE,基本正则表达式。在BRE中,必须像()\(一样对捕获组\)进行转义,并匹配文字)符号,只需)即可。< / p>

示例:

$ echo "var c = require(require('path').resolve(path) + '/node_modules/' + file);" | sed 's/^\(.*\)require(require\(.*\));$/\1require\2;/'
var c = require('path').resolve(path) + '/node_modules/' + file;

答案 1 :(得分:3)

如果你给它-r标志,GNU sed支持扩展的正则表达式。

sed -i.bak -r 's/^(.*?require\()require\((.*)\)/\1\2/' file

Ideone Demo

答案 2 :(得分:1)

您可以使用此sed:

sed -i.bak -r 's/^(.* )(require\(require\()(.+)(\);)$/\1require(\3;/' file
var c = require('path').resolve(path) + '/node_modules/' + file;

ORX在OSX上使用sed -E

sed -i.bak -E 's/^(.* )(require\(require\()(.+)(\);)$/\1require(\3;/' file
var c = require('path').resolve(path) + '/node_modules/' + file;