Verifica arquivos para convenções

3

Eu preciso de um script que verifique e liste todos os arquivos de texto das convenções do projeto. Com convenções, quero dizer, por exemplo:

  • Codificação UTF-8
  • Sem espaços em branco à direita
  • Nova linha no final do arquivo
  • Nenhum caractere não-ascii
  • LF para finais de linha

Eu não quero reinventar a roda. Talvez haja uma ferramenta fazendo isso. Você conhece algum?

    
por Robert Moszczynski 09.12.2014 / 15:49

2 respostas

5

Detectando

  • Codificação UTF-8 : file geralmente fornece a codificação:

    file --brief --mime-encoding myfile.txt

    Note que ele pode ser 'us-ascii' ou 'utf-8', dependendo se ele encontrar algum caractere UTF-8, então você precisará aceitar ambos.

Os pontos a seguir exigirão que você canalize a saída em wc -l (para contar o número de linhas da saída) e verifique se é 0 ou não. Alternativamente, eles geralmente devem ter um valor de retorno de 0 se encontrarem algo, ou 1 se não (nesse caso, suas necessidades são atendidas):

  • Sem espaços em branco à direita : isso é um trabalho para grep , eu suponho:

    grep -e '\s\+$' myfile.txt
  • Nova linha no final do arquivo : se o último caractere de acordo com hexdump ou xxd for 0a , há uma nova linha e tudo bem:

    xxd -ps myfile.txt | tail -n 1 | grep '0a$'

    ( note que, ao contrário dos outros pontos denotados aqui, você quer que isso ache algo )

  • Não chars não-ascii : é o mesmo que "codificação UTF-8", exceto talvez um pouco mais rigoroso.

    Se você realmente quiser ter certeza de que há apenas caracteres ASCII em um arquivo (veja a resposta do @ Anthon), você provavelmente precisará de algo como

    xxd -g1 myfile.txt | cut -c 10-56 | grep '[a-f89][a-f0-9]'

    Isso procura por qualquer caractere fora do intervalo ASCII (0x00-0x7F). Não é muito elegante, no entanto.

  • LF para fins de linha : file sem opções lhe dirá algo como

    ASCII text, with CRLF line terminators

    Para um script, provavelmente algo como o seguinte poderia fazer:

    xxd -g1 myfile.txt | cut -c 10-56 | grep '0d'

Corrigindo

  • Codificação UTF-8 : existe iconv (1) . Essencialmente, é necessária uma codificação "de" ( -f ), uma codificação "para" ( -t ) e o arquivo. A codificação "para" é provavelmente utf-8 , enquanto a codificação "de" pode ser obtida usando file , conforme descrito no topo da minha postagem:

    file_encoding="$(file --brief --mime-encoding myfile.txt)"
    iconv -f "$file_encoding" -t 'utf-8' myfile.txt
  • Sem espaços em branco à direita : é um trabalho para sed , embora eu prefira o POSIX (ou seja, sem -i switch), o que significa usar printf + ex . De qualquer forma, o regex será parecido com s/\s\+$//g . Para o modo compatível com POSIX:

    printf "%%s/\s\+\$//g\nwq\n" | ex -s myfile.txt

    Para o modo não compatível com POSIX:

    sed -i 's/\s\+$//g' myfile.txt
  • Nova linha no final do arquivo : os aplicativos Unix geralmente acrescentam uma nova linha ausente no final do arquivo quando a salvam. Para explorar isso, isso é um truque:

    printf "wq\n" | ex -s myfile.txt

    ( isto irá apenas abrir, salvar, sair )

  • Nenhum caracter não ascii : consulte "Codificação UTF-8" acima.

  • LF para fins de linha : dos2unix (1) . Deve fazer exatamente o que você precisa.

por 09.12.2014 / 18:50
0

Você deve tentar o comando file , ele já faz um bom trabalho ao determinar informações sobre o conteúdo, embora não analise o arquivo de dados completo.

Se você tem um arquivo grande somefile onde o primeiro caractere utf-8 não aparece até o final, file somefile não detectará isso como um arquivo utf-8.

    
por 09.12.2014 / 16:06