texto - regex linux terminal




Excluir diretórios.svn do grep (8)

Dois greps farão o truque:

  1. O primeiro grep terá tudo.
  2. O segundo grep usará a saída do primeiro grep como entrada (via tubulação). Usando o sinalizador -v, o grep selecionará as linhas que NÃO correspondem aos termos da pesquisa. Voila Você fica com todas as saídas do primeiro grep que não contêm .svn no caminho do arquivo.

    -v, --invert-match Inverte o sentido da correspondência para selecionar linhas não correspondentes.

    grep the_text_you_want_to_search_for * | grep -v .svn
    

Esta questão já tem uma resposta aqui:

Quando eu grudo meu diretório de cópia de trabalho do Subversion, os resultados incluem muitos arquivos dos diretórios .svn. É possível recursivamente grep um diretório, mas excluir todos os resultados de diretórios .svn?


Eu acho que a opção --exclude de recursão é o que você está procurando.


No meu GNU grep 2.5, --exclude-dirs não é uma opção válida. Como alternativa, isso funcionou bem para mim:

grep --exclude="*.svn-base"

Esta deve ser uma solução melhor do que excluir todas as linhas que contêm .svn/ uma vez que não filtraria acidentalmente essas linhas em um arquivo real.


O psychoschlumpf está correto, mas só funciona se você tiver a última versão do grep . Versões anteriores não têm a opção --exclude-dir . No entanto, se você tiver uma base de código muito grande, o double- grep -ing poderá demorar uma eternidade. Solte isso em seu .bashrc para um grep .svn -less portátil:

alias sgrep='find . -path "*/.svn" -prune -o -print0 | xargs -0 grep'

Agora você pode fazer isso:

sgrep some_var

... e obter resultados esperados.

Claro, se você é uma pessoa insana como eu, que só tem que usar o mesmo .bashrc todos os lugares, você poderia gastar 4 horas escrevendo uma função bash supercomplicada para colocar lá. Ou você poderia apenas esperar por uma pessoa insana como eu postar online:

http://gist.github.com/573928


Para a versão 2.5.1 do grep, você pode adicionar vários itens --exclude para filtrar os arquivos .svn .

$ grep -V | grep grep
grep (GNU grep) 2.5.1

GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R  whatever ./

Para grep> = 2.5.1a

Você pode colocar isso em seu ambiente (por exemplo, .bashrc )

export GREP_OPTIONS='--exclude-dir=".svn"'

PS: graças a Adrinan, existem citações extras na minha versão:

export GREP_OPTIONS='--exclude-dir=.svn'

Se você usar o ack (um 'grep melhor'), ele irá lidar com isso automaticamente (e fazer muitas outras coisas inteligentes também!). Vale a pena conferir.


grep --exclude-dir=".svn"

funciona porque o nome ".svn" é bastante singular. Mas isso pode falhar em um nome mais generalizado.

grep --exclude-dir="work"

não é à prova de balas, se você tiver "/ home / user / work" e "/ home / user / stuff / work" ele irá ignorar ambos. Não é possível definir "/ * / work / *" para restringir a exclusão apenas ao nome da pasta anterior. Até onde eu pude experimentar, no GNU grep o simples --exclude não excluirá os diretórios.





grep