sed“e”和“g”标志不能一起工作

spi*_*kus 8 linux sed

鉴于这种:

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 等)?

Mic*_*mer 9

这些标志以与您期望的相反的方式协同工作。的文档/e,作为记录:

该命令允许将来自 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则会执行在模式空间中找到的命令,并用其输出替换模式空间。尾随换行符被抑制;如果要执行的命令包含空字符,则结果未定义。这是一个 GNU sed 扩展。

写的有点曲折。这意味着,在s///此行的命令完成后,如果发生更改,则(新)行作为命令执行,其输出用作此行的替换。

所以对于你给定的命令:

echo AAA | sed -r 's/A/echo B/ge'
Run Code Online (Sandbox Code Playgroud)

它首先将每个替换Aecho B然后将结果作为命令执行。它具有(粗略地说)与以下相同的效果:

echo AAA | sed -r 's/A/echo B/g' | sh
Run Code Online (Sandbox Code Playgroud)

GNUsed不直接支持您想要的模式,尽管您可以根据需要使用更复杂的脚本来伪造它。或者,Perl/e对其s命令的修饰符确实具有您正在寻找的行为,但改为使用 Perl 表达式。


PM *_*ing 5

正在越来越多替代品,但你没有得到多次执行。一旦完成所有替换,就会执行该模式。

没有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)