Я сталкивался с этим решением для печати определенной строки из текстового файла:
sed '123!d;q' file
Почему в этом случае sed не завершает работу после первой строки ввода?
На английском языке эта 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
.{d;q;}
, не должныq
применяться к каждой строке (так только к первой)?q
применяется к каждой строке, где она выполняется. Но когда номер строки не 123,d
команда выполняется, и ее смысл состоит в том, чтобы сразу перейти к следующей строке ввода.sed -n 123p
(печатает тот же вывод), за исключением того, что останавливается после строки 123, а не обрабатывает потенциально еще тысячи строк, с которыми он никогда не будет ничего делать.