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

0

Estou tentando localizar arquivos que correspondam a um padrão específico, mas tentar executar o comando abaixo não retorna resultados, embora existam arquivos que correspondam ao padrão.

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

Eu sei que o .*/ corresponde ao caminho inteiro, mas não entende exatamente o que isso significa exatamente.

Os arquivos que ele precisa corresponder, por exemplo, incluem

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png
por PeanutsMonkey 11.01.2013 / 08:45

1 resposta

1

O problema real da sua expressão regular é que ela não corresponde ao que deve corresponder. Para dividir:

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

    Isso funciona porque as expressões regulares são "gananciosas" por padrão, o que significa que elas correspondem o máximo que podem. Em essência, essa parte permite que você pesquise apenas o nome real do arquivo e retire 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ê precisar coincidir algumas partes do caminho com o arquivo, não será possível usar .*/

  • s_ - funciona muito bem no seu exemplo

  • [a-zA-Z] - isso só consome um caractere dessa classe

  • _ - seguido por um sublinhado

  • [a-zA-Z] - novamente seguido por um caractere

  • \.png - corresponde literalmente ao ponto e à extensão

Então, você precisa alterar sua regex para:

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

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

    
por 11.01.2013 / 09:07