Was macht die Option -n in sed?

13

Dies ist der Manpage-Eintrag für -n:

-n

Unterdrücken Sie das automatische Drucken des Musterbereichs

Ich stelle fest , dass , wenn nicht die Verwendung -nfür bestimmte Operationen, wobei jede Zeile in stdout gedruckt wird (und die angeforderten Zeilen gedruckt zweimal):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

Dieses Gesetz gilt jedoch nicht für andere Befehle:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Was -ngenau macht es also?

dotancohen
quelle

Antworten:

17

Normalerweise verarbeitet sed jede Zeile (Ersetzungen usw.) und druckt dann das Ergebnis aus. Wenn bei der Verarbeitung die Zeile gedruckt wird (z. B. der pBefehl von sed ), wird sie zweimal gedruckt (einmal während der Verarbeitung, dann erneut durch den automatischen Nachbearbeitungsdruck). Die -nOption deaktiviert den automatischen Druck, dh die Zeilen, die Sie nicht ausdrücklich zum Drucken anweisen, werden nicht gedruckt, und Zeilen, die Sie ausdrücklich zum Drucken anweisen (z. B. mit p), werden nur einmal gedruckt.

  • sed -n '2,3p' test.txt - druckt wie gewünscht nur die Zeilen 2 bis 3

  • sed '2,3p' test.txt - druckt jede Zeile (automatisch) und druckt AUCH die Zeilen 2-3 ein zweites Mal

  • sed -n 's/t/T/' test.txt - ersetzt "t" durch "T" in jeder Zeile, druckt aber das Ergebnis aufgrund von nicht aus -n

  • sed 's/t/T/' test.txt - ersetzt "t" durch "T" in jeder Zeile und druckt automatisch das Ergebnis

Und lassen Sie mich noch einige Beispiele hinzufügen:

  • sed -n 's/t/T/p' test.txt - ersetzt "t" durch "T" in jeder Zeile, druckt NUR Zeilen, in denen die Ersetzung stattgefunden hat (dh nicht "Sekunde")

  • sed 's/t/T/p' test.txt - ersetzt "t" durch "T" in jeder Zeile, druckt Zeilen, in denen die Ersetzung stattgefunden hat, und druckt dann automatisch jede Zeile (Ergebnis: "Sekunde" wird einmal gedruckt, alle anderen zweimal)

  • sed '2,3p; 3p' test.txt- druckt die Zeilen 1, 4 und 5 einmal (der automatische Druck); Zeile 2 zweimal (der erste pBefehl, dann der automatische Druck) und Zeile 3 dreimal (einmal für jeden pBefehl, dann wieder automatisch).

Gordon Davisson
quelle
Vielen Dank, Gordon, aber Ihre Einschätzung wiederholt nur meine Beobachtung. In den ersten beiden Beispielen -nwird jede Zeile zusätzlich zu den speziell angeforderten Zeilen ohne Ausdruck gedruckt. Somit wird in diesem Fall -n das Drucken jeder analysierten Zeile unterdrückt . Im dritten und vierten Beispiel ist das Verhalten jedoch unterschiedlich. In diesen Fällen gibt sed without -ndie Zeilen nicht zweimal aus, daher unterdrückt die Verwendung -nnicht das Drucken jeder analysierten Zeile , sondern das Drucken von nicht geänderten Zeilen . Ich habe Schwierigkeiten zu verallgemeinern, wann das Verhalten das eine oder andere sein wird.
Dotancohen
Nein, in beiden Fällen -nwird genau das Gleiche getan: Wenn Sie von jeder automatisch gedruckten Zeile (und dem Modifikator pund pzu einem Ersatzbefehl, wird die Zeile zusätzlich gedruckt) in einen Modus wechseln, in dem Zeilen nur gedruckt werden , wenn Sie dies ausdrücklich angeben zu (mit dem pBefehl etc).
Gordon Davisson
Anders ausgedrückt: Versuchen Sie, die -nOption hinzuzufügen UND AUCH ; pzum Befehl sed hinzuzufügen (z. B. sed -n '2,3p; p'und Sie erhalten die gleichen Ergebnisse wie ohne. Der Befehl -nunterdrückt den automatischen Standarddruck und ; pfügt einen expliziten (meistens äquivalenten) hinzu ) drucken.
Gordon Davisson
Ich sehe jetzt, danke. Ich freue mich sehr, dass Sie sich die Zeit genommen haben, um das Beispiel deutlich zu machen. Habt eine tolle Woche!
Dotancohen