Использование sed для замены первого совпадения в файле - зачем печатаются последующие строки?

Я выполнил следующие инструкции: http://www.webupd8.org/2010/05/how-to-disable-ipv6-in-ubuntu-1004.html

Он отлично работал на 10.04 , 10.10 и 11.04.

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

3 ответа

'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 вышел. [ ! d1]

Возможно, это более понятно, если вы используете -n и добавили p в свой цикл:

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

после n, p принудительно печатает все, кроме первого line

$ 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
ответ дан 22 May 2018 в 15:36
  • 1
    Сначала команда n печатает, а затем следит за следующим вводом. Правильно? Я думал, что sed всегда знает, что это последняя строка, поэтому он просто выходит без автопринта. Спасибо, Zanna, ваш ответ действительно полезен. – Smile 11 January 2018 в 15:11
  • 2
    @Smile :) да, n сначала печатает пространство шаблонов, а затем заменяет его следующей строкой. Последняя строка была прочитана в пространстве шаблонов с помощью n, затем в следующем цикле она была напечатана, и заменить ее не на то, чтобы sed вышел. Вы могли бы сказать, что команда n завершена на полпути своей работы, потому что она сделала первый шаг (печать), а затем не могла продолжить второй шаг (заменить), потому что больше не было ввода. – Zanna 11 January 2018 в 15:14
  • 3
    Теперь это очень ясно. Благодарю. – Smile 11 January 2018 в 15:17
'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 вышел. [ ! d1]

Возможно, это более понятно, если вы используете -n и добавили p в свой цикл:

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

после n, p принудительно печатает все, кроме первого line

$ 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
ответ дан 17 July 2018 в 23:21
'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 вышел. [ ! d1]

Возможно, это более понятно, если вы используете -n и добавили p в свой цикл:

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

после n, p заставляет печатать все, кроме первого line

$ 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
ответ дан 24 July 2018 в 13:52

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

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