Por que o metacaracteres \ d não está funcionando no comando find com -regextype posix-egrep ativo?

2

Eu tenho uma lista de arquivos .jpg no meu diretório atual com os seguintes caminhos:

./ex.jpg
./ex1234.jpg
./ex4321.jpg

E estou tentando corresponder apenas aqueles que contêm números com expressões regulares e o comando find . Aqui está o comando que estou executando:

find . -regextype posix-egrep -regex "\.\/ex\d+\.jpg"

No entanto, isso não corresponderá a nada no meu diretório. E ainda mais estranho é o fato de que o seguinte comando (substituindo \d+ with \d* ):

find . -regextype posix-egrep -regex "\.\/ex\d*\.jpg"

produz apenas :

./ex.jpg

Eu tentei essa expressão regular alterando o comando -regextype para todas as outras opções disponíveis, mas isso não parece causar nenhum impacto.

Alguém pode explicar esse comportamento?

Minha versão do find : (GNU findutils) 4.7.0-git no Ubuntu 16.04.3 LTS para o Windows Subsystem para Linux.

    
por Esteban Mendoza 10.11.2017 / 20:32

1 resposta

3

\d (para um dígito decimal) não é suportado pela sintaxe da expressão regular estendida (ERE) POSIX (ou GNU grep) - como você pode confirmar facilmente:

$ echo 'foo1234bar' | grep -E '\d'

Na verdade, \d vem de perl e é suportada pelo GNU grep no modo PCRE (expressão regular compatível com perl):

$ echo 'foo1234bar' | grep -P '\d'
foo1234bar

No entanto, isso não ajuda muito em find , já que o AFAIK ainda não fornece PCRE regextype - você terá que usar o intervalo de caracteres simples [0-9] , que é suportado por ERE e por básico expressões (BRE):

find . -regextype posix-egrep -regex "\.\/ex[0-9]+\.jpg"

O motivo \d*\.jpg corresponde a ex.jpg porque \d é tratado como literal d - e zero ou mais de qualquer coisa corresponde a tudo.

    
por steeldriver 11.11.2017 / 00:53