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?
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?
Odpowiedzi:
W języku angielskim ten sedprogram 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);dpolecenie 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
{d;q;}, czy nie powinien qodnosić się do każdej linii (a więc tylko pierwszej)?
qma zastosowanie do każdej linii, w której jest wykonywany. Ale gdy numerem wiersza nie jest 123, dpolecenie 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.
!był połączonyd, nie123.