Я натрапив на це рішення для друку певного рядка з текстового файлу:
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.