Як працює ця команда 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

@Gilles: відсутні дужки {d;q;}, не повинні qзастосовуватися до кожного рядка (тому лише першого)?
enzotib

1
@enzotib qзастосовується до кожного рядка, де він виконаний. Але коли номер рядка не 123, dкоманда виконується, і її значення полягає в тому, щоб негайно перейти до наступного рядка введення.
Жил 'SO- перестань бути злим'

Кришталево зрозуміле пояснення
Рахул Патіл

По суті, він робить те саме, що sed -n 123p(друкує той самий вихід), за винятком того, що він зупиняється після рядка 123, а не обробляє потенційно ще тисячі рядків, з якими він ніколи нічого не зробить.
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.