Reguläre Ausdrücke und grep funktionieren nicht

Reguläre Ausdrücke und grep funktionieren nicht

Ich habe den folgenden regulären Ausdruck:

([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})

Die Daten sollten in diesem Format vorliegen:

2010-12-19

Und ich verwende es für Dateinamen, die so aussehen:

2010-12-19-xxx-xxx-xxx.markdown

Und wenn ich es grepso verwende:

echo $POST | grep -oE "([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})" # $POST is the filename

Es funktioniert nicht, ich fühle nur Leere.

Antwort1

Versuche dies:-

echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"

Wenn ich es hier versuche, erhalte ich: -

[andys@daedalus ~]$ echo "2010-12-19-aaa-bbb-ccc-ddd.markdown" | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"
2010-12-19

Ich hoffe, das ist, wonach Sie suchen.

Antwort2

Andys Antwort ist in Ordnung, aber wenn Sie etwas möchten, das näher an Ihrer ursprünglichen Syntax liegt, können Sie Folgendes versuchen:

echo $POST | egrep -oE "([[:digit:]]{4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})"

Sie benötigen hier egrep für erweiterte reguläre Ausdrücke und die doppelten Klammern für Zeichenklassen.

Antwort3

Sie brauchen die Klammern nicht, aber Sie brauchen mehr eckige Klammern. Zeichenklassen haben dieselben Eigenschaften wie einzelne Zeichen. So wie Sie nach Vokalen wie diesen suchen: [aeiou]oder nach Ziffern wie diesen: [0123456789]oder diesen: [0-9]müssen Sie eine Klasse wie [:digit:]oder [:upper:]ebenfalls in einen Klammerausdruck einschließen: [[:xdigit:]](Hexadezimalziffern).

grep -oE "[[:digit:]]{4}-[[:digit:]]{1,2}-[[:digit:]]{1,2}"

verwandte Informationen