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?

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.