Ack regex em nomes de arquivos

1

De acordo com este tópico :

Q: My understanding is that ack uses Perl-derivative regular expressions, is that correct?

A: Yes. In fact, ack is written in Perl and just forwards the expressions to the internal engine.

Agora, tenho um arquivo no diretório atual chamado:

media_group_xml_producer.py

quando faço:

> ack -n '.*group.*producer.*' 

ou mais diretamente:

> ack -n --python '.*group.*producer.*' 

Não obtenho resultados. Tanto quanto eu posso dizer, o regex deve coincidir com este arquivo. Por que falta isso?

    
por Amelio Vazquez-Reina 13.01.2015 / 15:01

2 respostas

3

Se você precisar digitar nomes de arquivos no diretório atual, tudo o que precisa é

ack corresponde ao conteúdo dos arquivos, não ao nome deles. Para encontrar arquivos cujo nome corresponda a um regex, execute ack sobre a lista de nomes de arquivos:

ls | ack '.*group.*producer.*'

O que você fez, ou seja

ack -n '.*group.*producer.*'

irá procurar pelos arquivos no diretório atual contendo algo correspondente ao regex.

Se você deseja executar sua regex em nomes de arquivos completos, incluindo o caminho do subdiretório

ls não vai cortá-lo, porque não tem uma opção para imprimir o caminho junto com o nome do arquivo. Em vez disso, use tree com sinalizadores -i (não imprima linhas de indentação) e -f (imprima nomes de arquivo completos).

tree -if | ack 'shepherd.*\.pyc?'

retorna

./models/shepherd.py
./models/shepherd.pyc
./services/shepherd-related/flock_of_sheep.py
./services/shepherd-related/flock_of_sheep.pyc

Todos os itens acima funcionam com grep e ack , é claro. Mas ack é definitivamente melhor em todos os sentidos. : -)

    
por 13.01.2015 / 15:21
3

Você entendeu mal o que o ack faz. É um grep -analog, não um find -analog. Ele pesquisa o conteúdo dos arquivos para o padrão fornecido e não para os nomes de arquivos que correspondem ao padrão. Você deveria usar

find -regex '.*group.*producer.*' 

Ou

find -name '*group*producer*' 

Se você insistir em usar ack (apesar de não ver sentido em fazê-lo), você pode analisar sua saída para obter seu arquivo:

$ ack -f | ack '.*group.*producer.*' 
media_group_xml_producer.py

O ack -f apenas imprimirá todos os arquivos que seriam pesquisados sem realmente pesquisar nada e o segundo imprimirá os nomes dos arquivos que corresponderem ao seu regex.

    
por 13.01.2015 / 15:22