Wie funktioniert dieser sed Befehl?

12

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?

Eugene Yarmash
quelle

Antworten:

20

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);
  • dann (aber wir erreichen diesen Punkt nur, wenn der 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
Gilles 'SO - hör auf böse zu sein'
quelle
Danke, das hat es mir auch geklärt. Mein Fehler war, dass ich verstanden !habe d, mit was nicht verbunden war 123.
rozcietrzewiacz
@ Gilles: Fehlen die Klammern {d;q;} , sollte nicht qfür jede Zeile gelten (also nur für die erste)?
Enzotib
1
@enzotib 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.
Gilles 'SO - hör auf böse zu sein'
Kristallklare Erklärung
Rahul Patil
Im Wesentlichen funktioniert es wie 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.
Wildcard