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