centos SED在替换中使用捕获组[已关闭]

zqry0prt  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(119)

**关闭。**这个问题是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

b1zrtrql

b1zrtrql1#

我试着把它作为一个反向引用,但也没有解决这个问题。是我的语法错了吗
是的。在sed的正则表达式方言中,反向引用的语法是\1\2etc..
命令行在调用任何命令之前由shell处理。这包括参数扩展,您将依赖于参数扩展通过变量eregex提供正则表达式。但是$1也是一个变量引用,并且它也将被扩展(在您的例子中,显然没有)。
我试着把它作为一个反向引用,但也没有解决这个问题。
反斜杠(\)是shell的单字符引号。除了在单引号字符串中,\1等同于1。shell将在命令行处理的引号删除阶段将前者转换为后者。要将文本\传递给sed,必须将其加倍,或者将其括在单引号字符串中。比如说

sed -i -E "s~${eregex}~CH/\\1~g"

sed -i -E "s~${eregex}~CH/"'\1~g'

(The在这种情况下,花括号不是必需的,但我认为在变量引用中使用花括号是一种好的形式。)
还是捕获组未按预期工作?尝试使用非捕获组以及可能的扩展,但似乎不支持。
正确,sed不识别Perl风格的非捕获组。

相关问题