$ 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
-n
n
sed
-n
如果您使用并添加p
到循环中,可能会更清楚:
$ sed -n '/#/ {s//=/; :k n;p; bk}' rgb
UPPER (#2): "RED GREEN BLUE"
之后n
,p
强制打印除第一行之外的所有内容。
$ sed -n '/#/ {s//=/; :k p;n; bk}' rgb
lower (=1): "red green blue"
UPPER (#2): "RED GREEN BLUE"
之前n
,p
强制每次打印模式空间。n
从不打印任何内容,因为自动打印被禁用。
尝试在循环中的不同位置-n
使用命令删除该选项。p
如果您只想在更改后打印一行,则可以使用q
:
$ sed '/#/ s//=/;q' rgb
lower (=1): "red green blue"