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
grep
VerwendetPosix-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 -P
Perl Compatible Regex () zu verwenden, PCRE
falls 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 grep
damit nichts geschieht.
Wenn Sie nur die Versionsnummer wünschen,verwenden\K
und -o
Option:
grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt
Ausgabe:
1.2.3
Mit BRE
ist dies nicht möglich, Sie müssen zwei grep
Befehle 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