
Eu tenho os seguintes arquivos e preciso combiná-los como:
./foo.bar1.sh -match
./qux/foo.bar2.sh -match
./foo.sh -match
./baz.sh -no match
./foo.bar3 -no match
Eu tentei:
find . -regex ".*foo(bar[0-9])?\.sh"
Mas não retorna nada. Não consigo entender por que esse regex não funciona.
Responder1
Sua expressão regular tem dois erros:
Falta um ponto (literal) depois de
foo
.find
exige que você escape dos parênteses quandonãousado como parênteses literais.
Além disso, você deve escapar do ponto antes sh
, pois ele corresponderá a qualquer caractere.
O comando fixo agora diz:
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
A propósito, o erro 2. é a razão pela qual não gosto da opção find
de -regex
: Escape inconsistente.
Funciona, é claro, mas grep -P
usa expressões regulares compatíveis com Perl (PCRE), portanto, há mais recursos, mas menos surpresas e armadilhas.
Pessoalmente, eu usaria:
find . | grep -P "foo(\.bar\d)?\.sh"