Verwenden Sie grep, um basierend auf regulären Ausdrücken Text aus einer Datei zu extrahieren

Verwenden Sie grep, um basierend auf regulären Ausdrücken Text aus einer Datei zu extrahieren

Ich habe diese Datei:

header:
  title: hello
  version: 1.2.3

Ich möchte die Versionsnummer extrahieren.

Mein ursprünglicher Versuch war

grep ^\s+version:\s+(\d\.\d\.\d) file.txt

aber das erzeugte eine leere Ausgabe. Nach Vorschlägen in den Kommentaren habe ich versucht

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

aber ich bekomme „Version: 1.2.3“ statt „1.2.3“.

Was mache ich falsch?

Antwort1

grepVerwendetPosix-Basis-Regex( BRE) standardmäßig, was Ihre Notation nicht unterstützt.

Verwenden Sie es grep -E, um Posix Extended Regex ( ERE) zu nutzen und grep -PPerl Compatible Regex () zu verwenden, PCREfalls verfügbar.

Ihre Notation funktioniert mit grep -P:

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

Dies funktioniert mit BRE:

grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt

Ausgabe:

  version: 1.2.3

Beachten Sie, dass die Erfassungsgruppe hier nicht erforderlich ist, da grepdamit nichts geschieht.


Wenn Sie nur die Versionsnummer wünschen,verwenden\Kund -oOption:

grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt

Ausgabe:

1.2.3

Mit BREist dies nicht möglich, Sie müssen zwei grepBefehle verketten:

grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'

oder verwenden Sie sed(Credits @Kusalananda):

sed -n 's/.*version: //p' file.txt

Antwort2

Nach dem Kommentar vonpLumoUndSo verwenden Sie grep, um alles direkt nach dem Namen abzurufenEin funktionierender Befehl könnte sein

 grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt

verwandte Informationen