使用 sed 替换文件中的第一个匹配项 - 为什么会打印后续行?

使用 sed 替换文件中的第一个匹配项 - 为什么会打印后续行?
$ cat rgb
lower (#1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

$ sed '/#/ {s//=/; :k n; bk}' rgb
lower (=1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

我知道sed如果没有下一行可以追加,则退出而不自动打印。但是在这个例子中sed打印了最后一行。它是如何工作的?

答案1

'n'
     (next) If auto-print is not disabled, print the pattern space,
     then, regardless, replace the pattern space with the next line of
     input.  If there is no more input then 'sed' exits without
     processing any more commands.

-n选项禁用自动打印。

您在第一行中用#替换了(模式空间)。然后,由于没有选项,模式空间被打印出来。然后,模式空间被下一行替换,然后我们循环到,这导致模式空间被打印出来,因为自动打印未被禁用,然后没有更多输入行,因此退出。=#n-nnsed

-n如果您使用并添加p到循环中,可能会更清楚:

$ sed -n '/#/ {s//=/; :k n;p; bk}' rgb
UPPER (#2): "RED GREEN BLUE"

之后np强制打印除第一行之外的所有内容。

$ sed -n '/#/ {s//=/; :k p;n; bk}' rgb
lower (=1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

之前np强制每次打印模式空间。n从不打印任何内容,因为自动打印被禁用。

尝试在循环中的不同位置-n使用命令删除该选项。p

如果您只想在更改后打印一行,则可以使用q

$ sed '/#/ s//=/;q' rgb
lower (=1): "red green blue"

相关内容