3

У меня есть следующее регулярное выражение:

([: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

Это не работает, я просто получаю пустоту.

3 ответа3

4

Попробуй это:-

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

Надеюсь, это то, что вы ищете.

3

Энди ответит хорошо, но если вы хотите что-то ближе к исходному синтаксису, вы можете попробовать:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .