Ich bin auf diese Lösung zum Drucken einer bestimmten Zeile aus einer Textdatei gestoßen:
sed '123!d;q' file
Warum wird sed in diesem Fall nach der ersten Eingabezeile nicht beendet?
Auf Englisch sed
bedeutet dieses Programm: für jede Zeile
123!
] wenn die aktuelle Zeilennummer nicht 123 ist, dann [ d
] lösche die aktuelle Zeile und beginne den nächsten Zyklus (dh gehe zur nächsten Zeile);d
Befehl nicht ausgeführt wurde), beenden Sie [ q
], ohne weitere Zeilen zu verarbeiten (aber drucken Sie die aktuelle Zeile in unserem Todeskampf aus).Oder wenn Sie es vorziehen, in Shell-Syntax:
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
!
habed
, mit was nicht verbunden war123
.{d;q;}
, sollte nichtq
für jede Zeile gelten (also nur für die erste)?q
gilt für jede Zeile, in der es ausgeführt wird. Wenn die Zeilennummer jedoch nicht 123 lautet, wird derd
Befehl ausgeführt, und es wird sofort zur nächsten Eingabezeile gesprungen.sed -n 123p
(druckt die gleiche Ausgabe), außer dass es stoppt nach Zeile 123 , anstatt möglicherweise Tausende weiterer Zeilen zu verarbeiten, mit denen es sowieso nichts zu tun hat.