O Linux “find -regex” não manipula a ligação

2

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:

encontre. -regex ". * foo (bar [0-9]) ?. sh"

mas não retorna nada. Eu não consigo descobrir porque esse regex não funciona ... ajuda por favor?

    
por Jordan 31.05.2012 / 06:23

1 resposta

2

Sua expressão regular tem dois erros:

  1. Ele perde um ponto (literal) depois de foo .

  2. find exige que você escape dos parênteses quando não é usado como parênteses literais.

Além disso, você deve escapar do ponto antes de sh , pois ele corresponderá a qualquer caractere.

O comando fixo agora lê:

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

O erro 2, a propósito, é o motivo pelo qual eu não gosto da opção find -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"
    
por 31.05.2012 / 07:22