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
ouxxd
for0a
, 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 comoASCII 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" é provavelmenteutf-8
, enquanto a codificação "de" pode ser obtida usandofile
, 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 usarprintf
+ex
. De qualquer forma, o regex será parecido coms/\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.