Wie druckt man den Text zwischen dem ersten Vorkommen eines Zeichenfolgenpaars?

Wie druckt man den Text zwischen dem ersten Vorkommen eines Zeichenfolgenpaars?

Ich versuche, einen Teil einer Datei zu filtern, die zwei digitale Zertifikate enthält. Grundsätzlich möchte ich den ersten Teil (sagen wir Cert1) und nicht den zweiten Teil (Cert2).

Inhalt der Datei ist:

-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----

Ich war der Meinung, dass ich dadurch den Inhalt von Cert1 erhalten würde(der erste Teil zwischen dem ersten BEGIN und dem ersten END):

cat /etc/nginx/cert.pem | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

Aus irgendeinem Grund wird mir jedoch immer noch der gesamte Inhalt zwischen dem zweiten BEGIN und dem zweiten END angezeigt.(im Grunde ändert sich nichts; alle Inhalte sind gleich).

Irgendwelche Hinweise?

Antwort1

Sie waren fast da:

sed -ne '
   /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p      # got the range, ok
   /-END CERTIFICATE-/q                            # bailing out soon as the cert end seen
' /etc/nginx/cert.pem

Beachten Sie jedoch, dass die Markierungszeilen für den Zertifikatsanfang und das Zertifikatsende ebenfalls Teil der Ausgabe sind.

Antwort2

Sie können für diese Aufgabe den folgenden sed-Befehl verwenden

sed '/-----END CERTIFICATE-----/q' /etc/nginx/cert.pem

qist ein Exit-Code, der sed anweist, zu beenden. Daher druckt sed vom Anfang der Datei aus und beendet sich, wenn das Muster '-----END CERTIFICATE-----' gefunden wird. Dies führt dazu, dass es am Ende des ersten Zertifikats anhält.

Außerdem ist es nicht erforderlich, eine Pipe zu verwenden, um die Ausgabe von cat an sed umzuleiten. Geben Sie einfach den Dateinamen im sed-Befehl an.

Quelle -http://www.theunixschool.com/2011/09/sed-selective-printing.html

verwandte Informationen