2

我有一个有效的 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/

知道我做错了什么吗?

4

3 回答 3

3

正常 sed 使用BRE基本正则表达式。在 BRE 中,捕获组()必须像这样转义\(\)并且匹配文字)符号)就足够了。

例子:

$ 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;
于 2014-08-23T17:17:49.740 回答
3

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

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

Ideone 演示

于 2014-08-23T17:21:45.587 回答
1

你可以使用这个 sed:

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

或在 OSX 上使用sed -E

sed -i.bak -E 's/^(.* )(require\(require\()(.+)(\);)$/\1require(\3;/' file
var c = require('path').resolve(path) + '/node_modules/' + file;
于 2014-08-23T17:22:47.997 回答