**关闭。**这个问题是not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我试图在Centos 7上使用SED(sed (GNU sed) 4.2.2
)(操作系统似乎与AWS Linux 2发生的相同行为无关),并且我的捕获组没有被添加回替换字符串。
我正在尝试添加一个目录到m3u8文件的资源。正则表达式在进行替换时是正确的,但它丢失了第一个捕获组中应该捕获的内容。
验证码:
eregex='([0-9]+_?[0-9]*[.](ts|key))'
find . -type f -exec grep -lZEe "$eregex" {} + | xargs -r0 sed -i -E "s~$eregex~CH/$1~g"
原始数据:
https://example.com/dir/dir2/number/12345.key
执行后的行为:
https://example.com/dir/dir2/number/CH/
预期结果:
https://example.com/dir/dir2/number/CH/12345.key
我试过将它用作\1
的反向引用,但也没有解决这个问题。这里是我的语法错误,还是捕获组没有按预期工作?尝试使用非捕获组以及可能的扩展,但似乎不支持。
https://regex101.com/r/CSWeFx/1
1条答案
按热度按时间b1zrtrql1#
我试着把它作为一个反向引用,但也没有解决这个问题。是我的语法错了吗
是的。在
sed
的正则表达式方言中,反向引用的语法是\1
,\2
,etc..命令行在调用任何命令之前由shell处理。这包括参数扩展,您将依赖于参数扩展通过变量
eregex
提供正则表达式。但是$1
也是一个变量引用,并且它也将被扩展(在您的例子中,显然没有)。我试着把它作为一个反向引用,但也没有解决这个问题。
反斜杠(
\
)是shell的单字符引号。除了在单引号字符串中,\1
等同于1
。shell将在命令行处理的引号删除阶段将前者转换为后者。要将文本\
传递给sed
,必须将其加倍,或者将其括在单引号字符串中。比如说或
(The在这种情况下,花括号不是必需的,但我认为在变量引用中使用花括号是一种好的形式。)
还是捕获组未按预期工作?尝试使用非捕获组以及可能的扩展,但似乎不支持。
正确,
sed
不识别Perl风格的非捕获组。