Suponha que eu queira pesquisar em uma árvore inteira todos os arquivos CPP em que "Foo" ocorre. Eu devo fazer:
find . -name "*.cpp" | xargs grep "Foo"
Agora, suponha que eu queira listar apenas as instâncias em que alguma outra string, como "Bar", não ocorre dentro de três linhas do resultado anterior.
Então, com dois arquivos:
a.cpp
1 Foo
2 qwerty
3 qwerty
b.cpp
1 Foo
2 Bar
3 qwerty
Gostaria de construir uma pesquisa simples onde "Foo" de a.cpp é encontrado, mas "Foo" de b.cpp não é.
Existe uma maneira de fazer isso de uma maneira bastante simples?
Respostas:
Com
pcregrep
:A chave está na
-M
opção que é exclusivapcregrep
e usada para corresponder a várias linhas (pcregrep
extrai mais dados do arquivo de entrada conforme necessário ao caminhar pelo ER).(?!...)
é o operador RE antecipado do perl / PCRE.Foo(?!...)
correspondeFoo
desde...
que não corresponda ao que se segue....
sendo(?:.*\n){0,2}.*Bar
(.
não correspondendo a um caractere de nova linha), que é de 0 a 2 linhas, seguido por uma linha que contémBar
.fonte
pcregrep
? Eu nunca ouvi falar disso antes.(?!...)
antecipadoperl
.Não importa, basta usar
pcregrep
como sugerido por @StephaneChazelas.Isso deve funcionar:
A idéia é usar o
-A
switch grep para gerar as linhas correspondentes e as N linhas seguintes. Em seguida, você passa o resultado por umgrep Bar
e, se isso não corresponder (saída> 0), você repetirá o nome do arquivo.Se você sabe que possui nomes de arquivos sãos (sem espaços, novas linhas ou outros caracteres estranhos), pode simplificar:
Por exemplo:
Observe que
c.cpp
é retornado apesar de conterBar
porque a linha comBar
é mais de 3 linhas depoisFoo
. Você pode controlar o número de linhas que deseja pesquisar, alterando o valor passado para-A
:Aqui está um mais curto (supondo que você use
bash
):IMPORTANTE
Como Stephane Chazelas apontou nos comentários, as soluções acima também imprimirão arquivos que não contêm
Foo
nada. Este evita que:fonte
Foo
. Você tem cotações ausentes.Foo
e eu consertei isso, mas não entendo seu ponto de vista sobre várias instâncias deFoo
. Deve lidar com eles corretamente.Não testado, estou no meu telefone:
algo parecido.
fonte