Meine Beispielzeichenfolge lautet wie folgt:
This is 02G05 a test string 20-Jul-2012
Nun möchte ich aus der obigen Zeichenfolge extrahieren 02G05
. 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, den ich glaube, ist, dass er nichts mit dem Muster vergleichen kann, das ich sed geliefert habe.
Meine Frage ist also, was ich hier falsch mache und wie ich es korrigieren kann.
Wenn ich die obige Zeichenfolge und das obige Muster mit Python ausprobiere, erhalte ich mein Ergebnis
>>> re.findall(r'\d+G\d+',st)
['02G05']
>>>
sed
. Ihre Regex-Aromen sind sehr unterschiedlich.Antworten:
Das Muster wird
\d
möglicherweise von Ihrem nicht unterstütztsed
. Versuchen Sie es[0-9]
oder[[:digit:]]
stattdessen.Verwenden Sie eine Ersetzung, um nur die tatsächliche Übereinstimmung (nicht die gesamte übereinstimmende Zeile) zu drucken.
quelle
.*
dies bei Ihrer Regex notwendig ist, denn wenn ich es versuchesed -n 's/\([0-9]\+G[0-9]\+\)/\1/p'
, wird nur die gesamte Zeile gedruckt.2G05
nicht02G05
. Der Ausdruck, der funktioniert, ist's/.*\([0-9][0-9]G[0-9][0-9]*\).*/\1/p'
sed -n 's/\(.*[^0-9]\)\?\([0-9][0-9]*G[0-9][0-9]*\).*/\2/p'
wäre allgemeiner. (Ich nehme an, Ihresed
Unterstützung\?
für null oder ein Vorkommen.)\w
,\s
etc.Wie wäre es mit
grep -E
?quelle
sed
Für diesen Fall könnte ein komplexes Skript entwickelt werden, aber warum sollte man sich die Mühe machen?egrep
verwendet Extended Regexpsed
undgrep
verwendet Standard Regexpegrep
odergrep -e
odersed -E
Extended Regexp, und der Python-Code in der Frage verwendet PCRE (Perl Common Regular Expression). GNU grep kann PCRE mit-P
Option verwenden.egrep
odergrep -E
odersed -r
grep
muss-m 1
nach dem ersten Spiel aufhören.sed
erkennt nicht\d
, verwenden Sie[[:digit:]]
stattdessen. Sie müssen auch+
den-r
Schalter verlassen oder den Schalter verwenden (-E
unter OS X).Beachten Sie, dass dies
[0-9]
auch für arabisch-hinduistische Ziffern funktioniert.quelle
sed -n '/[0-9]\+G[0-9]\+/p'
. Jetzt druckt es nur die ganze ZeichenfolgeVersuchen Sie stattdessen Folgendes:
Beachten Sie jedoch, dass bei einer Zeile mit zwei Mustern das zweite gedruckt wird.
quelle
Versuchen Sie es mit rextract . Sie können Text mit einem regulären Ausdruck extrahieren und neu formatieren.
Beispiel:
quelle
\d
völlig überflüssig.