Por que esse regex não funciona no linux?

5

Não posso dizer que funciona no Windows, mas, pelo que entendi, esse regex está correto e como eu o escreveria (exceto talvez o ^ no início)

De link

^.+\.((jpg)|(gif)|(exe))$

Quando eu corro

find -regex '^.+\.((jpg)|(gif)|(exe))$'

meu exe não aparece quando eu escrevo

find -regex '^.+\.exe$'

Sim. Por que o find -regex não usa () ou (()|())? ? Sempre achei que era válido para tudo.

    
por 7ochem 23.10.2009 / 18:06

2 respostas

10

O GNU find por padrão usa expressões regulares do emacs, você pode mudar esse tipo com a opção -regextype (veja man find).

Se você usa -regextype posix-egrep , sua expressão parece funcionar. Você poderia então também reduzir o padrão para ^.+(jpg|gif|exe)$

Com o emacs: find . -regex '.+\(jpg\|gif\|exe\)$' . Consulte esta seção do manual do emacs para ver as regras regex específicas. Você precisa escapar de | e () para que não sejam literais.

    
por 23.10.2009 / 18:11
3

Em expressões regulares emacs ( , | e ) são literais a menos que escapem, isso é exatamente o oposto de todos os outros formatos de expressões regulares.

Sua expressão funciona como ^.+\.\(jpg\|exe\|gif\)$ .

    
por 23.10.2009 / 18:19