Was ist eigentlich die Bedeutung von "-n" in der sed?
Laut http://linux.about.com/od/commands/l/blcmdl1_sed.htm
unterdrücken der automatischen Druck-Muster
Raum
Habe ich getestet, mit oder ohne -n
sed produzieren gleiche Ergebnis
Ich verstehe nicht, was Raum bedeutet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur versuchen, eine sed-tun-nichts:
und
Zuerst wird gedruckt, ganze Datei, aber der zweite wird NICHT drucken nichts.
-n
UND-i
. Ich habe eine leere Datei und nicht warum. Ich habe gerade beendet, da sah ich Ihren Kommentar, vielen Dank!Sed hat zwei Orten zu speichern text: pattern space und hold space. Muster Raum ist, wo jede Linie wird die Verarbeitung durch sed-Befehle; Raum ist ein Hilfs Ort, um einige text, den Sie verwenden möchten, können später. Sie werden wahrscheinlich verwenden Sie nur pattern space.
Bevor sed geht das verarbeiten einer Zeile, es wird in den pattern space. Dann, sed gilt für alle Befehle (wie
s///
) de Muster Raum und standardmäßig druckt der resultierende text im pattern space. Nehmen wir an wir haben eine Dateimyfile
mit einer Zeile wie:Wir den folgenden Befehl ausführen:
Sed gelten
s/fox/coati/
und danns/dog/dingo/
für jede Zeile der Datei, in diesem Fall, die einzige, die wir oben gezeigt haben. Wenn es Auftritt, wird die Zeile in der Muster-Raum, die den folgenden Inhalt haben:Dann, sed führt den ersten Befehl. Nach sed-führt den Befehl
s/fox/coati/
, den Inhalt des pattern space wird:Dann sed wird der zweite Befehl, der
s/dog/dingo/
. Danach wird der Inhalt des pattern space wird:Beachten Sie, dass dies nur geschieht, in-memory - nichts gedruckt wird, durch jetzt.
Nachdem alle Befehle wurden auf die aktuelle Zeile angewendet, standardmäßig, sed erhalten dann den Inhalt des pattern space und drucken Sie es auf die standard-Ausgabe. Jedoch, wenn Sie geben
-n
als eine option, um die sed, Sie fordern sed zu tun, nicht ausführen dieser Letzte Schritt außer wenn es ausdrücklich erforderlich. Also, wenn Sie Sie ausführenwird nichts gedruckt werden.
Aber wie konnte Sie explizit anfordern sed zum drucken der Muster-space? Gut, Sie können die
p
Befehl. Wenn sed findet dieser Befehl druckt den Inhalt des pattern space sofort. Zum Beispiel, in dem Sie folgenden Befehl ein, wir bitten sed-drucken den Inhalt des pattern space, gleich nach dem ersten Befehl:Wird das Ergebnis
Beachten Sie, dass nur
fox
ersetzt wird. Es geschieht, weil der zweite Befehl nicht ausgeführt wurden, bevor das Muster den Raum wird gedruckt. Wenn wir wollen, drucken Sie das Muster, Raum, nachdem die beiden Befehle, den wir erstp
nach dem zweiten:Weitere option, wenn Sie die
s///
Befehl, ist die übergabe derp
Flagge zus///
:In diesem Fall die Zeile wird nur gedruckt, wenn die gekennzeichnet Ersatz wurde ausgeführt. Es kann sehr nützlich sein!
Stellt diese sed in quiet-Modus, wo sed-unterdrückt alle Ausgaben, außer wenn ausdrücklich eine
p
Befehl:Ein Beispiel HIERFÜR wäre, wenn Sie wollte sed simulieren die Aktionen von grep:
ohne die
-n
Sie bekommen würde ein vorkommen von c (und zwei vorkommen von a und b)Den pattern space ist gedruckt implizit.
$ echo "a b c d" | sed -n "s/a/apple/"
Keine Ausgabe.
Explizit das Muster drucken Raum.