O utilitário pcregrep
suporta correspondência para padrões de várias linhas, por isso é fácil .
Primeiro, você precisa de uma lista de arquivos para pesquisar; em um repositório git, meu próprio utilitário git find pode ser útil para isso, mas o find(1)
regular e outras ferramentas também fazer.
Transmita a lista de arquivos para pcregrep
, despeje sua saída em um arquivo temporário e, em seguida, revise manualmente a lista de arquivos (por exemplo, para remover os binários que estavam presentes na primeira lista) antes de agir:
# easy to type version
git find | xargs pcregrep -l -M $'\n\n\n' >/tmp/x
# more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' >/tmp/x
Observação: o recurso $'…'
precisa de suporte do seu shell (GNU bash, AT & T ksh93, mksh, zsh e POSIX sh da versão futura do suporte padrão). Caso contrário, digite '
, pressione Return três vezes e digite '
novamente.
Se a sua lista inicial for sensata o suficiente, você pode atuar diretamente na lista de resultados:
# easy to type version
$EDITOR $(git find \*.java | xargs pcregrep -l -M $'\n\n\n')
# somewhat more secure version
git find -print0 | xargs -0r pcregrep -l -M $'\n\n\n' | xargs $EDITOR --
⚠ A versão "mais segura" é necessária, a menos que seus nomes de arquivo não contenham nenhum caracteres "engraçados", nem espaços! O “um pouco mais seguro” no último exemplo refere-se ao problema que a opção -l
do pcregrep sempre termina a LF e não tem nenhuma opção para terminá-la NUL, então nomes de arquivos com novas linhas embutidas são sempre inseguros com esta solução.