Como encontro arquivos com várias linhas vazias?

3

Para substituir várias linhas vazias por apenas uma eu preciso encontrar quais arquivos aplicar isso em primeiro lugar , em um grande repositório. Como faço isso?

    
por mirabilos 19.07.2016 / 16:24

2 respostas

3

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.

    
por 19.07.2016 / 16:24
1

Com awk implementações que suportam nextfile :

... -print0 | xargs -r0 awk '
    FNR == 1 {n = 0}
    $0 == "" {
      if (++n == 2) {
        print FILENAME
        nextfile
      }
      next
    }
    {n = 0}'

Altere para printf "%s$0 == """, FILENAME para nomes de arquivos delimitados por NUL. Altere !NF para %code% para verificar linhas em branco em vez de linhas vazias.

    
por 28.07.2016 / 17:59