Ich sah von
Wie zu verwenden sed, um nur das erste Vorkommen in einer Datei zu ersetzen?
Wie ich das meiste mache, was ich will:
%Vor%Dies findet die erste Übereinstimmung von etwas und extrahiert sie (natürlich ist mein reales Beispiel komplizierter). Ich weiß, dass sed einen "quit" -Befehl hat, der es früh anhalten lässt, aber ich weiß nicht, wie ich das "q" mit der obigen Zeile kombinieren soll, um mein gewünschtes Verhalten zu erhalten.
Ich habe versucht, das "p" durch {p; q;} zu ersetzen, wie ich in einigen Beispielen gesehen habe, aber das funktioniert eindeutig nicht.
Mein spezifischer Anwendungsfall war es, über 'git log' auf einem git-p4 importierten Baum herauszufinden, welche Verzweigung für das letzte Commit verwendet wurde. git log (wenn ohne -n aufgerufen wird, protokolliert jedes Commit, das passiert ist (Hunderttausende für mich)).
Wir können a priori nicht wissen, welchen Wert man für '-n' bekommt. Nachdem ich das gepostet hatte, fand ich meine Lösung, die war:
%Vor%Ich würde immer noch gerne wissen, wie man das mit einem Trennzeichen ohne '/' macht, und ohne den 'git-p4' Teil zweimal angeben zu müssen, einmal für die Extraktion und einmal für den Quit. Es muss eine Möglichkeit geben, beides auf derselben Linie zu kombinieren ...
Der "print and quit" -Trick funktioniert, wenn Sie auch den Substitutionsbefehl in den Block schreiben (anstatt nur den Ausdruck zu setzen und dort zu beenden).
Versuchen:
%Vor%Lesen Sie dies wie folgt: Match für das Muster zwischen den Schrägstrichen gegeben. Wenn dieses Muster gefunden wird, führen Sie die im Block angegebenen Aktionen aus: Ersetzen, Drucken und Beenden. In der Regel sind Match- und Substitutionsmuster gleich, aber dies ist nicht erforderlich, daher könnte der Befehl 's' auch ein anderes RE enthalten.
Tatsächlich ist das ziemlich ähnlich zu dem, was ghostdog74 für gawk beantwortet hat.
Sed hat normalerweise eine Option, um mehr als ein Muster für die Ausführung anzugeben (IIRC, es ist die Option -e
). Auf diese Weise können Sie ein zweites Muster angeben, das nach der ersten Zeile beendet wird.
Ein anderer Ansatz besteht darin, sed
zu verwenden, um die erste Zeile ( sed '1q'
) zu extrahieren, und dann an einen zweiten sed
-Befehl zu übergeben (was Sie oben zeigen).
Tags und Links sed