it-swarm.com.de

Wie kann man mit sed Text aus einer Zeichenfolge extrahieren?

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']
>>>
69
RanRag

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'
65
tripleee

Wie wäre es mit egrep?

echo "This is 02G05 a test string 20-Jul-2012" | egrep -o '[0-9]+G[0-9]+'
75
mVChr

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.

4

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.

4
Zsolt Botykai

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
0
Tim Savannah