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 grep
so 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}"