Regex 具有捕获组的有效正则表达式,但sed脚本不起作用

Regex 具有捕获组的有效正则表达式,但sed脚本不起作用,regex,bash,sed,capture-group,Regex,Bash,Sed,Capture Group,我有一个有效的正则表达式模式,它捕获字符串的三组。我试图在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/n

我有一个有效的正则表达式模式,它捕获字符串的三组。我试图在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;
我在这里确认了我的正则表达式:

…并在此处再次检查:


知道我做错了什么吗?

普通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;

GNU sed支持扩展正则表达式,如果您给它设置了
-r
标志

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

您可以使用此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;

太棒了,谢谢你!我想我写这个问题比你回答这个问题花的时间要长。谢谢你的快速回复!阿维纳什击败了你,所以我接受了他的回答…但我也感谢你的帮助。谢谢你的回复!我接受了第一个正确的答案,但我真的很感激。@ShaunScovil不用担心。没有“有效的regexp”这样的东西。每个regexp仅在要在其中使用它的工具以及在调用该工具时使用的选项和分隔符的上下文中“有效”。在awk中“有效”的regexp可能不在sed中,对于
sed's/regexp/'
来说“有效”的regexp可能不适用于
sed's#regexp#
sed-r's/regexp/'
,等等@EdMorton我想如果你想挑拨离间,我可以这么说“在JavaScript、PHP、Python和Bash中实现所需结果的正则表达式不能与sed一起使用”…但为了简洁起见,我认为在这里使用“valid”一词是可以的。:-)如果你认为RE是“valid”,而不说明它对什么工具有效,甚至不说明它是否是“valid”,那你就错了“是的,是的,是的,还是。。。这充其量只是误导。您的RE包含
+
,例如,在sed中,它表示后跟加号的任何单个字符。这是任何RE的“有效”语法,但这就是您想要它的意思吗?在awk或GNU中,使用-r表示任何单个字符重复1次或多次。也许这就是你说的“有效”吧?