Sed Erläuterung: sed '/./,$!d' Datei

7

Könnte jemand bitte diesen Code erklären, der alle führenden Leerzeilen am Anfang einer Datei löscht:

sed '/./,$!d' file

Ich verstehe, dass es sich um einen regulären Ausdruck handelt, der nur dem ersten Zeichen entspricht, aber dann verstehe ich den Teil $! D nicht. Wird es dadurch ersetzt oder sind es Optionen für das Spiel?

Ist dies überhaupt ein Suchbefehl, wenn er nicht mit 's /' ... beginnt?

Codequelle (aus einer anderen Frage)

Emerson Peters
quelle

Antworten:

12
sed '/./,$!d'

Von der ersten Zeile, die ein Zeichen enthält (leer oder nicht) bis zum Ende der Datei - negieren (dh vom Anfang der Datei bis zur Zeile vor der ersten Zeile, die ein Zeichen enthält) - löschen.

Dadurch werden führende Leerzeilen und keine Leerzeilen gelöscht. Um führende Leerzeilen zu löschen (Zeilen, die leer sind oder nur Leerzeichen enthalten), sagen Sie '/\S/,$!d'.

Lesen Sie "Sed, eine Einführung und ein Tutorial" unter http://www.grymoire.com/Unix/Sed.html . Lesen Sie dann das Referenzhandbuch unter https://www.gnu.org/software/sed/manual/sed.html .

Zusamenfassend:

  • Die allgemeine Form eines sedBefehls ist [Selektor] [Negation] Befehl [Flags] (eckige Klammern geben optionale Teile an).

  • Der Selektor wählt, falls vorhanden, die Zeilen aus, auf die der Befehl angewendet wird

  • Wenn !angezeigt wird, wird der Selektor negiert, dh der Befehl wird auf die Zeilen angewendet, die nicht mit dem Selektor übereinstimmen.

  • Wenn kein Selektor vorhanden ist, gilt der Befehl für alle Zeilen.

  • Ein Selektor kann eine Zeile (nach Nummer) oder eine Reihe von Zeilen (nach regulärem Ausdruck) oder die Zeilen zwischen einer Startzeile (nach Nummer oder regulärem Ausdruck) und einer Endzeile (nach Nummer oder regulärem Ausdruck) auswählen.

  • In unserem Fall ist die Auswahlvorrichtung, /./,$die eine Einrichtung von der ersten Zeile gefunden , die Übereinstimmungen /./(das heißt, mindestens ein Zeichen) auf das Ende der Datei ( $ist als eine Zeilennummer verwendet , und eine Einrichtung , die letzte Zeile in der Datei).

  • Es wird von negiert !, sodass der Befehl auf die Zeilen vom Anfang der Datei bis zur Zeile vor dem ersten Zeilenabgleich angewendet wird /./.

  • Der Befehl dlöscht die ausgewählten Zeilen.

AlexP
quelle
Könnten Sie bitte jede Sache einzeln erklären? Was macht das Komma? Ich weiß, dass $ das Ende der Zeichenfolge bedeutet. Ich vermute das! bedeutet das negieren? Wie kam es dazu, den Punkt "Anfang der Datei bis zur Zeile vor der ersten Zeile, die ein Zeichen enthält" zu definieren?
Emerson Peters
Sind die $! D Teil des Ersetzungsabschnitts oder sind sie Optionen wie das g für eine globale Suche?
Emerson Peters
Ich hatte beide Registerkarten geöffnet, konnte jedoch im Inhaltsverzeichnis oder durch kurzes Überfliegen keinen Verweis auf diese Optionen / Befehle finden, sodass ich nicht wusste, wo ich suchen sollte. Es sieht so aus, als ob ich zuerst ein globaleres Verständnis von sed brauche. Vielen Dank, dass Sie ins Detail gegangen sind. Ich werde dies als Referenz verwenden, wenn ich später studiere. :)
Emerson Peters