git grep
Aqui está a sintaxe usando git grep
combinando vários padrões usando expressões booleanas:
git grep -e "life" --and -e "happy" --and -e "horse"
O comando acima imprimirá linhas correspondentes a todos os padrões de uma só vez.
Se os arquivos não estiverem sob controle de versão, adicione --no-index
param.
Search files in the current directory that is not managed by Git.
Verifique man git-grep
para ajuda.
grep
Normalmente, o parâmetro grep
com -f
imprime linhas com pelo menos um padrão, por exemplo,
grep -f args.txt file.txt
No seu caso, não funcionará.
Para imprimir linhas que correspondam a todos os padrões ao mesmo tempo, você pode tentar este comando:
while read n text; do [ $n -eq $(wc -l < args.txt) ] && echo $text; done < <(while read patt; do grep "$patt" text.txt; done < args.txt | sort | uniq -c)
Explicação:
- O loop
while
interno imprimirá todas as linhas que corresponderem a pelo menos um padrão em text.txt
usando a lista de padrões do arquivo args.txt
.
- Em seguida, essa lista é classificada (
sort
) e contada para o número de ocorrências ( uniq -c
).
- O loop externo
while
imprimirá apenas as linhas que tiverem o mesmo número de ocorrências que o número de padrões em args.txt
(que é 3).
Outra abordagem seria remover todas as linhas que não correspondam a pelo menos um padrão.
Aqui está a solução usando o editor Ex / Vim para alterar o arquivo no local:
while read patt; do ex +"v/$patt/d" -scwq text.txt; done < args.txt
Nota: Isso removerá as linhas desnecessárias do próprio arquivo.
Aqui está uma versão mais curta que imprimirá o resultado somente na tela:
ex $(xargs -I% printf "+v/%/d " < args.txt) +%p -scq! text.txt
Altere +%p -scq!
para -scwq
para salvá-lo no local no arquivo.
E aqui está a solução, definindo um alias de shell:
alias grep-all="</dev/stdin $(xargs printf '|grep "%s"' < args.txt)"
Uso da amostra:
grep-all file.txt
Relacionados: