Ich sah ausWie sed verwenden, um etwas aus der ersten Zeile zurückzugeben, die übereinstimmt und früh aufgibt?
How to use sed to replace only the first occurrence in a file?
Wie die meisten tun, was ich will:
sed -n '0,/.*\(something\).*/s//\1/p'
Dies findet das erste Spiel von etwas und extrahiert es (natürlich mein wirkliches Beispiel ist komplizierter) . Ich weiß, dass sed einen "quit" -Befehl hat, der es früh anhalten lässt, aber ich weiß nicht, wie man das "q" mit der obigen Zeile kombiniert, 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.
Können Sie mehr zeigen, was Sie bekommen und was Sie wollen und wie sie sich unterscheiden? Ich habe 'echo -e 'aaa 111 aaa \ nbbb 111 bbb" | sed -n' 0, /. * \ (111 \). */S // \ 1/p'' und bekam eine "111". Dann habe ich 'echo -e 'aaa 111 aaa \ nbbb 111 bbb" | sed -n' 0,/\ (. * \ (111 \). * \)/S // \ 1/p'', um das zu zeigen volle Linie, um sicherzustellen, was es bekam und es "aaa 111 aaa" ausgab, was ich erwartet hatte. Beachten Sie, dass ich kein 'q' verwende. Wie funktioniert es nicht für dich? –
Ihre Methode generiert zwar die korrekte Ausgabe, verarbeitet aber weiterhin die gesamte Datei, obwohl keine Arbeit mehr erforderlich ist, was für riesige Dateien oder die Verwendung in einer Pipeline schrecklich ist.Mein spezifischer Anwendungsfall war, über 'git log' auf einem git-p4 importierten Baum herauszufinden, welcher Verzweigungszweig für das letzte Commit verwendet wurde. git log (wenn ich ohne -n angerufen werde, protokolliere jedes Commit, das passiert ist (Hunderttausende für mich). Wir können a priori nicht wissen, welchen Wert git für '-n' erhalten soll. Meine Lösung war: git log | sed -n '0, /. * \ [git-p4:. * \/\/depot \/blah \/\ ([^ \ /] * \) \ /.*/ s // \ 1/p;/\ [git-p4/q ' – nosatalian