Por que a expressão regular find a seguir não funciona no Linux?

Por que a expressão regular find a seguir não funciona no Linux?

Estou tentando localizar arquivos que correspondam a um padrão específico, mas a tentativa de executar o comando abaixo não retorna resultados, mesmo que existam arquivos que devam corresponder ao padrão.

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

Eu sei que isso .*/corresponde a todo o caminho, mas não entendo muito bem o que isso significa exatamente.

Os arquivos que ele deve corresponder, por exemplo, incluem

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png

Responder1

O problema real com sua expressão regular é que ela não corresponde ao que deveria corresponder. Para decompô-lo:

  • .*/– qualquer caractere, várias vezes, seguido de uma barra. Isso basicamente consome a lista de diretórios antes do nome real do arquivo, para que corresponda literalmente ./(como no seu exemplo), mas também ./some/other/dir/até a última barra.

    Isso funciona porque as expressões regulares são "gananciosos" por padrão, o que significa que elas correspondem tanto quanto podem. Em essência, esta parte permite apenas pesquisar o nome real do arquivo e retirar o caminho do resultado.

    Para resumir, você precisa do .*/na frente do regex se tudo o que importa é o nome real do arquivo. Se você também precisar combinar algumas partes do caminho com o arquivo, não poderá usar.*/

  • s_– isso funciona muito bem no seu exemplo

  • [a-zA-Z]– isso só consomeumpersonagem desta classe

  • _– seguido por um sublinhado

  • [a-zA-Z]– novamente seguido porumpersonagem

  • \.png– combine literalmente o ponto e a extensão

Então, você tem que mudar seu regex para:

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

Você terá que usar o +, que basicamente diz um ou vários dos anteriores.

informação relacionada