Como determinar a linha que termina de um arquivo
-
02-07-2019 - |
Pergunta
Eu tenho um monte (centenas) de arquivos que deveriam ter finais de linha Unix. Eu suspeito fortemente que alguns deles têm terminações de linha do Windows, e eu quero descobrir programaticamente fora que fazer.
Eu sei que posso apenas correr
flip -uou algo semelhante em um script para converter tudo, mas eu quero ser capaz de identificar os arquivos que precisam mudar primeiro.
Solução
Você pode usar grep
egrep -l $'\r'\$ *
Outras dicas
Você pode usar o file
ferramenta, que irá dizer-lhe o tipo de linha final. Ou, você pode simplesmente usar dos2unix -U
que irá converter tudo para finais de linha Unix, independentemente do que começou.
Algo ao longo das linhas de:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
embora alguns dos que regexp pode precisar de refino e arrumando a casa.
Essa saída'LL seu arquivo com Win, Mac ou UNIX no final de cada linha. Bom se o arquivo é de alguma forma uma bagunça terrível (ou um diff) e tem terminações mistos.
Aqui está a resposta mais à prova de falhas. Stimms responder a conta doesn para subdiretórios e arquivos binários
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
- Use
file
para encontrar o tipo de arquivo. Aqueles com CRLF têm janelas retornar caracteres. A saída dofile
é delimitada por uma:
, eo primeiro campo é o caminho do arquivo.
Unix usa um byte, 0x0A (Alimentação de linhas), enquanto o Windows usa dois bytes, 0x0D 0x0A (retorno de carro, alimentação de linha).
Se você nunca ver um 0x0D, então é muito provável Unix. Se você ver pares 0x0D 0x0A então é MSDOS muito provável.
Windows uso de char 13 & 10 para de fim de linha, unix apenas um deles (eu não rememeber qual). Então você pode substituir caractere 13 e 10 para caractere 13 ou 10 (aquele que usar unix).
Quando você sabe quais arquivos tem terminações do Windows de linha (0x0D 0x0A
ou \r \n
), o que você vai fazer com que os arquivos? Suponho, você vai convertê-los em fins de linha Unix (0x0A
ou \n
). Você pode converter arquivo com terminações de linha do Windows em finais de linha Unix com utilidade sed
, apenas o comando use:
$> sed -i 's/\r//' my_file_with_win_line_endings.txt
Você pode colocá-lo em script como este:
#!/bin/bash
function travers()
{
for file in $(ls); do
if [ -f "${file}" ]; then
sed -i 's/\r//' "${file}"
elif [ -d "${file}" ]; then
cd "${file}"
travers
cd ..
fi
done
}
travers
Se você executá-lo a partir do seu diretório raiz com arquivos, no final você vai ter certeza de todos os arquivos estão com terminações de linha Unix.