Come determinare la fine della linea di un file
-
02-07-2019 - |
Domanda
Ho un sacco (centinaia) di file che dovrebbero avere terminazioni di linea Unix. Sospetto fortemente che alcuni di essi abbiano terminazioni di linea di Windows e voglio capire a livello di codice quali lo fanno.
So che posso semplicemente eseguire
flip -uo qualcosa di simile in uno script per convertire tutto, ma voglio essere in grado di identificare quei file che devono prima essere modificati.
Soluzione
Puoi usare grep
egrep -l \r'\$ *
Altri suggerimenti
Qualcosa sulla falsariga di:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
anche se alcuni di questi regexp potrebbero aver bisogno di essere perfezionati e riordinati.
Questo produrrà il tuo file con WIN, MAC o UNIX alla fine di ogni riga. Buono se il tuo file è in qualche modo un disastro terribile (o un diff) e ha finali misti.
Ecco la risposta più sicura. La risposta agli stimoli non tiene conto delle sottodirectory e dei file binari
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
- Usa
file
per trovare il tipo di file. Quelli con CRLF hanno caratteri di ritorno a Windows. L'output difile
è delimitato da un:
e il primo campo è il percorso del file.
Unix utilizza un byte, 0x0A (LineFeed), mentre Windows utilizza due byte, 0x0D 0x0A (ritorno a capo, avanzamento riga).
Se non vedi mai uno 0x0D, è molto probabile che Unix. Se vedi coppie 0x0D 0x0A, è molto probabile che MSDOS.
Windows usa char 13 & amp; 10 per la fine della linea, unix solo uno di essi (non ricordo quale). Quindi puoi sostituire char 13 & amp; 10 per char 13 o 10 (quello, che usa unix).
Quando sai quali file hanno terminazioni di linea di Windows ( 0x0D 0x0A
o \ r \ n
), cosa farai con quei file? Suppongo che li convertirai in estremità di linea Unix ( 0x0A
o \ n
). Puoi convertire il file con i finali di linea di Windows in finali di linea Unix con l'utilità sed
, basta usare il comando:
#!/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
gt; sed -i 's/\r//' my_file_with_win_line_endings.txt
Puoi inserirlo nello script in questo modo:
<*>Se lo esegui dalla tua directory principale con i file, alla fine sarai sicuro che tutti i file hanno terminazioni di linea Unix.