Expressão regular e grep não funcionam

Expressão regular e grep não funcionam

Eu tenho a seguinte expressão regular:

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

Deve obter datas neste formato:

2010-12-19

E estou usando-o em nomes de arquivos parecidos com estes:

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

E, quando eu uso grepassim:

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

Não funciona, só fico vazio.

Responder1

Tente isto: -

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

Se eu tentar aqui, recebo: -

[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

Espero que seja isso que você está procurando.

Responder2

A resposta de Andy é boa, mas se você quiser algo mais próximo da sua sintaxe original, tente:

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

Você precisa do egrep aqui para expressões regulares estendidas e dos colchetes duplos para classes de caracteres.

Responder3

Você não precisa dos parênteses, mas precisa de mais colchetes. As classes de personagens têm as mesmas características dos personagens individuais. Assim como você pode pesquisar vogais como esta: [aeiou]ou dígitos como este: [0123456789]ou este: [0-9], você também precisa colocar uma classe como [:digit:]ou [:upper:]entre colchetes: [[:xdigit:]](dígitos hexadecimais).

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

informação relacionada