Eu precisava encontrar todos os arquivos que continham um padrão de string específico. A primeira solução que vem à mente é usar o find piped com xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Mas se eu precisar encontrar padrões que se estendam em mais de uma linha, eu estou preso porque o vanilla grep não pode encontrar padrões de várias linhas.
Respostas:
Então eu descobri o pcregrep, que significa Expressões regulares compatíveis com Perl GREP .
Por exemplo, você precisa encontrar arquivos onde a variável ' _name ' é imediatamente seguida pela variável ' _description ':
Dica: você precisa incluir o caractere de quebra de linha no seu padrão. Dependendo da sua plataforma, pode ser '\ n', \ r ',' \ r \ n ', ...
fonte
pcregrep
está disponível no mac combrew install pcre
-H
que imprime o nome do arquivo antes de cada partida:pcregrep -HM
.Por que você não usa o awk :
fonte
awk
que vem com a maioria dos sistemas * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Você pode torná-la mais bonita, dando os números de linha uma largura fixa:awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Aqui está o exemplo usando o GNU
grep
:Veja também aqui
fonte
-z
pesquisa em várias linhas, sem usar sinalizadores para não dividir a pesquisa em uma única linha e-o
imprimir apenas a parte correspondente.grep -rzl pattern *
, -rzo não funcionou)brew reinstall --with-pcre git
grep -P
também usa libpcre, mas é muito mais amplamente instalado. Para encontrar umatitle
seção completa de um documento html, mesmo que ele se estenda por várias linhas, você pode usar o seguinte:Como o projeto PCRE é implementado no padrão perl, use a documentação perl para referência:
fonte
Aqui está um exemplo mais útil:
Ele pesquisa a tag title em um arquivo html, mesmo que abranja até 5 linhas.
Aqui está um exemplo de linhas ilimitadas:
fonte
(?s)
a sua expressão regular, assim:"(?s)<html>.*</html>"
$
(no final de um padrão) para indicar que é o fim da linha - embora isso não seja o mesmo que ajudá-lo a encontrar vários padrões de linha. Veja tambémglob(7)
. Você também pode encontrar este site de seu interesse: regular-expressions.infoCom o pesquisador prateado :
As otimizações de velocidade do pesquisador de prata podem brilhar aqui.
fonte
Você pode usar a alternativa grep peneira aqui (disclaimer: Eu sou o autor).
Ele suporta correspondência multilinha e limita a pesquisa a tipos de arquivos específicos imediatamente:
(pesquise todos os arquivos * .py pelo padrão de regex multilinha especificado)
Está disponível para todos os principais sistemas operacionais. Dê uma olhada na página de amostras para ver como ela pode ser usada para extrair valores de várias linhas de um arquivo XML.
fonte
Esta resposta pode ser útil:
Regex (grep) para pesquisa em várias linhas necessária
Para encontrar recursivamente, você pode usar os sinalizadores -R (recursivo) e --include (padrão GLOB). Vejo:
Use grep --exclude / - sintaxe para não grep através de certos arquivos
fonte
@Marcin: exemplo awk não ganancioso:
fonte
fonte
Usando
ex
/vi
editor e opção globstar (sintaxe semelhanteawk
esed
):onde
aaa
é o seu ponto de partida ebbb
o texto final.Para pesquisar recursivamente, tente:
Nota: Para ativar a
**
sintaxe, executeshopt -s globstar
(Bash 4 ou zsh).fonte