Combine um Regex simples

1

Eu preciso corresponder isso: (tt \ d {1,10}) em um arquivo com o arquivo que termina txt.

Eu tentei o grep e o ack-grep, mas sem resultados.

ack-grep -G \.txt$ -g "(tt\d{1,10})"
    
por Patrik 18.10.2012 / 23:47

2 respostas

1

Eu uso find para esse tipo de coisa e faço com que execute grep nos arquivos correspondentes. Usando a regex do @dubiousjim acima:

find ./ -name "*.txt" -exec grep -Hn --color=auto 'tt[0-9]\{1,10\}' {} \;

Atualizar
Desculpe por inchar isso, mas senti que deveria voltar e explicar as opções com mais detalhes ...
O comando find acima é essencialmente dois comandos separados, reunidos em um com a opção '-exec'.

Este primeiro bit, espero, é bastante auto-explicativo: -
find ./ -name "*.txt"

Mas o subcomando -exec do find tem sua própria sintaxe especial. {} é específico da opção find e sua -exec , assim como \; . {} é substituído pelo nome completo do caminho correspondente e o \; significa o final dos argumentos da linha de comando para o programa exec'd, que neste caso é grep .

grep -Hn --color=auto 'regex' {} \;

Eu uso essas opções em uma tentativa de replicar a aparência de grep -r , imprimindo com cores, números de linha ( -n ) e nome de arquivo ( -H ) para cada expressão correspondente. Observe que o alias não funciona nos comandos exec'd por find , e é por isso que adiciono '--color=auto' manualmente.

    
por 19.10.2012 / 00:18
5

Com ack-grep , parece que você estava procurando

ack-grep -uhoG '\.txt$' 'tt\d{1,10}'

O que seria mais ou menos o equivalente ao comando find com o qual você "acabou", que, a propósito, pode ser otimizado para:

find . -name '*.txt' -exec grep -Eo 'tt[0-9]{1,10}' {} +

para evitar a execução de um comando grep por arquivo txt.

Você também pode considerar adicionar um -type f para evitar ter que pesquisar o texto em diretórios ou links simbólicos ou dispositivos ... (embora eu concorde que é raro (exceto para links simbólicos) que eles tenham *.txt nome).

Observe também que a opção -o para grep é específica do GNU e o GNU grep também tem uma opção -r para pesquisar recursivamente em diretórios, mas cuidado com versões mais antigas do GNU grep em symlinks para diretórios, portanto find geralmente é melhor / mais seguro se você não tiver um grep recente.

    
por 19.10.2012 / 00:40