$ 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
напечатана последняя строка. Как это работает?
'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
вышло. 1123]
Возможно, будет понятнее, если вы используете -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"