Использование 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 напечатана последняя строка. Как это работает?

2
задан 11 January 2018 в 13:54

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 вышло. 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"
2
ответ дан 11 January 2018 в 13:54

Другие вопросы по тегам:

Похожие вопросы: