我有一个有效的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/
知道我做错了吗?
答案 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
答案 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;