Как работает эта команда sed?

12

Я сталкивался с этим решением для печати определенной строки из текстового файла:

sed '123!d;q' file

Почему в этом случае sed не завершает работу после первой строки ввода?

Евгений Ярмаш
источник

Ответы:

20

На английском языке эта sedпрограмма означает: для каждой строки

  • [ 123!] если номер текущей строки не 123, то [ d] удалить текущую строку и начать следующий цикл (т.е. перейти к следующей строке);
  • затем (но мы достигаем этой точки, только если dкоманда не была выполнена), [ q] завершаем работу, не обрабатывая больше строк (но выводим текущую строку в наших умирающих муках).

Или, если хотите, в синтаксисе оболочки:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done
Жиль "ТАК - перестань быть злым"
источник
Спасибо, что это мне тоже прояснилось. Моя ошибка заключалась в том, что я понял, что !это связано с dне 123.
rozcietrzewiacz
@ Жиль: не хватает скобок {d;q;}, не должны qприменяться к каждой строке (так только к первой)?
энзотиб
1
@enzotib qприменяется к каждой строке, где она выполняется. Но когда номер строки не 123, dкоманда выполняется, и ее смысл состоит в том, чтобы сразу перейти к следующей строке ввода.
Жиль "ТАК - перестань быть злым"
Совершенно ясное объяснение
Рахул Патил
По сути, он делает то же самое, что и sed -n 123p(печатает тот же вывод), за исключением того, что останавливается после строки 123, а не обрабатывает потенциально еще тысячи строк, с которыми он никогда не будет ничего делать.
Wildcard