Mein Beispielstring lautet wie folgt:
This is 02G05 a test string 20-Jul-2012
Nun möchte ich aus dem obigen String 02G05
extrahieren. Dafür habe ich den folgenden Regex mit Sed ausprobiert
$ echo "This is 02G05 a test string 20-Jul-2012" | sed -n '/\d+G\d+/p'
Aber der obige Befehl gibt nichts aus und der Grund, aus dem ich glaube, ist, dass er nichts mit dem Muster übereinstimmen kann, das ich sed gegeben habe.
Meine Frage ist also, was mache ich hier falsch und wie ich es korrigieren kann.
Wenn ich den obigen String und das Pattern mit Python probiere, bekomme ich mein Ergebnis
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
Das Muster \d
wird möglicherweise nicht von Ihrer sed
unterstützt. Versuchen Sie stattdessen [0-9]
oder [[:digit:]]
.
Um nur die tatsächliche Übereinstimmung (nicht die gesamte übereinstimmende Zeile) zu drucken, verwenden Sie eine Ersetzung.
sed -n 's/.*\([0-9][0-9]*G[0-9][0-9]*\).*/\1/p'
Wie wäre es mit egrep
?
echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
sed
erkennt \d
nicht, verwenden Sie stattdessen [[:digit:]]
. Sie müssen auch den Code +
entfernen oder den Schalter -r
verwenden (-E
unter OS X).
Beachten Sie, dass [0-9]
auch für arabisch-hinduistische Zahlen funktioniert.
Versuchen Sie es stattdessen:
echo "This is 02G05 a test string 20-Jul-2012" | sed 's/.* \([0-9]\+G[0-9]\+\) .*/\1/'
Wenn sich jedoch zwei Muster in einer Zeile befinden, wird das zweite gedruckt.
Versuchen Sie es mit rextract . Sie können Text mit einem regulären Ausdruck extrahieren und neu formatieren.
Beispiel:
$ echo "This is 02G05 a test string 20-Jul-2012" | ./rextract '([\d]+G[\d]+)' '${1}'
2G05