$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
Der obige sed
Befehl ersetzt das neue Zeilenzeichen durch die Zeichenfolge "Zeichenfolge". Aber ich kenne die Bedeutung :a;$!N;s/\n/string/;ta
der einzelnen Anführungszeichen nicht. Ich kenne den Mittelteil s/\n/string/
. Aber ich kenne die Funktion von first ( :a;$!N;
) und last ( ta
) nicht.
sed
text-processing
Avinash Raj
quelle
quelle
Antworten:
Dies sind die zugegebenermaßen kryptischen
sed
Befehle. Speziell (vonman sed
):Das von Ihnen veröffentlichte Skript kann also unterteilt werden (Leerzeichen zur besseren Lesbarkeit hinzugefügt):
Grundsätzlich könnte das, was dies tut, im Pseudocode als geschrieben werden
Sie können dies anhand eines komplexeren Eingabebeispiels etwas besser verstehen:
Ich bin mir nicht sicher, warum das
!$
gebraucht wird. Soweit ich das beurteilen kann, können Sie mit dieselbe Ausgabe erzielenquelle
$!
nicht!$
. Es könnte jedoch auch sein!N
und nicht$!
.!N
noch gefunden$!
. Also denke ich immer noch, ob die letzte Zeile Newline oder EOF ist.$!
einen Adressbereich mit einem Postfix-Komplement-Operator vorzustellen - also$!N
(N
überall außer Adresse$
) ist wirklich die gleiche Syntax wie so etwas wiem,n!d
(alles löschen, außer Zeilenm
ann
).:
ist analog zumgoto
Label und war in der Tat:
ein Goto- Label in der Thompson-Shell, daher war es den Leuten früher bekannt, sowohlIch poste diese Antwort , da ich eine Menge Verwirrung über sehen , warum die letzte Zeile ist ausgeschlossen, wenn die Ausführung
N
(durch die Leitung Adressierung String$!
) und weil die OP über die Bedeutung verwechselt wurde:a;$!N;
in einem sed Befehl , nicht nur in dem spezifischen er geschrieben .Nun, der Vorteil der Verwendung von
$!N
anstelle vonN
ist in den vorgeschlagenen Beispielen (vom OP und von @terdon) nicht ersichtlich, da in der letzten Zeile nach demN
Befehl kein "wichtiger" Befehl (weiterlesen) ausgeführt wird . (In der Tat ist das Ergebnis dasselbe, wenn man diese Leitungsadresse entfernt.)In einem komplexeren Beispiel (z. B. Ersetzen
this sentence
in einer Datei, wobei die beiden Wörter manchmal in einer Zeile und manchmal in zwei Zeilen erscheinen) kannN
es entscheidend sein , die letzte Zeile für den Befehl auszuschließen ! Wenn die letzte Zeile nicht ausgeschlossen wirdN
,sed
trifft sie beim AusführenEOF
sofort und wird sofort beendet, wodurch verhindert wird, dass alle nachfolgenden Befehle (auch Verzweigungsbefehle, nämlicht
undb
) ausgeführt werden.In den zu vereinfachten Beispielen können wir die Ausführung sicher entfernen
$!
undsed
fehlschlagen lassenN
und zurückgeben, da der abgebrochenes
Befehl nichts tun würde, wenn er ausgeführt würde, da es keine\n
Übereinstimmung gibt.quelle