鉴于这种:
echo AAA | sed -r 's/A/echo B/ge'
Run Code Online (Sandbox Code Playgroud)
我明白了:
Becho Becho B
Run Code Online (Sandbox Code Playgroud)
我原以为我会得到“BBB”。这是 GNU sed 4.2.1 版。发生了什么,我如何使用执行标志,并且在一行上可以进行多次替换(来自 shell,而不是来自 perl 等)?
这些标志以与您期望的相反的方式协同工作。的文档/e
是,作为记录:
该命令允许将来自 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则会执行在模式空间中找到的命令,并用其输出替换模式空间。尾随换行符被抑制;如果要执行的命令包含空字符,则结果未定义。这是一个 GNU sed 扩展。
写的有点曲折。这意味着,在s///
此行的命令完成后,如果发生更改,则(新)行作为命令执行,其输出用作此行的替换。
所以对于你给定的命令:
echo AAA | sed -r 's/A/echo B/ge'
Run Code Online (Sandbox Code Playgroud)
它首先将每个替换A
为echo B
,然后将结果作为命令执行。它具有(粗略地说)与以下相同的效果:
echo AAA | sed -r 's/A/echo B/g' | sh
Run Code Online (Sandbox Code Playgroud)
GNUsed
不直接支持您想要的模式,尽管您可以根据需要使用更复杂的脚本来伪造它。或者,Perl/e
对其s
命令的修饰符确实具有您正在寻找的行为,但改为使用 Perl 表达式。
您正在越来越多替代品,但你没有得到多次执行。一旦完成所有替换,就会执行该模式。
没有e
标志的结果
echo AAA | sed -r 's/A/echo B/g'
Run Code Online (Sandbox Code Playgroud)
是
echo Becho Becho B
Run Code Online (Sandbox Code Playgroud)
所以如果你确实包含e
标志,那就是执行的命令行,这相当于
echo 'Becho Becho B'
Run Code Online (Sandbox Code Playgroud)