Natknąłem się na to rozwiązanie do drukowania określonej linii z pliku tekstowego:
sed '123!d;q' file
Dlaczego sed nie kończy się po pierwszym wierszu wprowadzania w tym przypadku?
W języku angielskim ten sed
program oznacza: dla każdej linii
123!
] jeśli bieżącym numerem linii nie jest 123, to [ d
] usuń bieżącą linię i rozpocznij następny cykl (tj. przejdź do następnej linii);d
polecenie nie zostało wykonane), [ q
] wychodzimy bez przetwarzania kolejnych linii (ale wypisujemy bieżącą linię w naszych umierających bólach).Lub, jeśli wolisz, w składni powłoki:
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
!
był połączonyd
, nie123
.{d;q;}
, czy nie powinienq
odnosić się do każdej linii (a więc tylko pierwszej)?q
ma zastosowanie do każdej linii, w której jest wykonywany. Ale gdy numerem wiersza nie jest 123,d
polecenie jest wykonywane, a jego celem jest natychmiastowe przejście do następnego wiersza wprowadzania.sed -n 123p
(drukuje ten sam wynik), z tym że zatrzymuje się po linii 123, zamiast przetwarzać potencjalnie tysiące kolejnych linii, z którymi i tak nigdy nic nie zrobi.