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?
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?
Antworten:
Auf Englisch sedbedeutet 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);dBefehl 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
{d;q;} , sollte nicht qfür jede Zeile gelten (also nur für die erste)?
qgilt für jede Zeile, in der es ausgeführt wird. Wenn die Zeilennummer jedoch nicht 123 lautet, wird der dBefehl 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.
!habed, mit was nicht verbunden war123.