У меня есть следующее регулярное выражение:
([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})
Даты должны быть в следующем формате:
2010-12-19
И я использую его для имен файлов, которые выглядят следующим образом:
2010-12-19-xxx-xxx-xxx.markdown
И когда я использую его grep
вот так:
echo $POST | grep -oE "([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})" # $POST is the filename
Это не работает, я ощущаю только пустоту.
решение1
Попробуй это:-
echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"
Если я попробую сделать это здесь, то получу:-
[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
Надеюсь, это то, что вы ищете.
решение2
Ответ Энди хорош, но если вам нужно что-то более близкое к исходному синтаксису, вы можете попробовать:
echo $POST | egrep -oE "([[:digit:]]{4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})"
Здесь вам понадобится egrep для расширенных регулярных выражений и двойные скобки для классов символов.
решение3
Вам не нужны скобки, но вам нужно больше квадратных скобок. Классы символов имеют те же характеристики, что и отдельные символы. Так же, как вы можете искать гласные, например, так: [aeiou]
, или цифры, например, так: [0123456789]
или так: , вам нужно также [0-9]
заключить класс, например, [:digit:]
или в выражение в скобках: (шестнадцатеричные цифры).[:upper:]
[[:xdigit:]]
grep -oE "[[:digit:]]{4}-[[:digit:]]{1,2}-[[:digit:]]{1,2}"