scripting - linea - escribir en un archivo unix
Cómo determinar el final de línea de un archivo (7)
Tengo un montón (cientos) de archivos que se supone que tienen terminaciones de línea Unix. Sospecho fuertemente que algunos de ellos tienen terminaciones de línea en Windows, y quiero averiguar mediante programación cuáles son.
Sé que solo puedo correr
flip -u o algo similar en un script para convertir todo, pero quiero poder identificar esos archivos que primero necesitan cambiar.
Unix usa un byte, 0x0A (LineFeed), mientras que Windows usa dos bytes, 0x0D 0x0A (Retorno de carro, avance de línea).
Si nunca ves un 0x0D, entonces es muy probable que sea Unix. Si ve pares 0x0D 0x0A, es muy probable que sea MSDOS.
Puede usar la herramienta de file
, que le indicará el tipo de línea que termina. O bien, podría usar dos2unix -U
que convertirá todo en terminaciones de línea Unix, independientemente de con qué comenzó.
Windows usa los caracteres 13 y 10 para el final de línea, solo unix uno de ellos (no recuerdo cuál). Así que puedes reemplazar los caracteres 13 y 10 por los caracteres 13 o 10 (el que usa Unix).
Puedes usar grep
egrep -l $''/r''/$ *
Algo como:
perl -p -e ''s[/r/n][WIN/n]; s[(?<!WIN)/n][UNIX/n]; s[/r][MAC/n];'' FILENAME
aunque parte de esa expresión regular puede necesitar refinación y limpieza.
Eso generará su archivo con WIN, MAC o UNIX al final de cada línea. Bien si su archivo es de alguna manera un desastre terrible (o un diff) y tiene terminaciones mixtas.
Cuando sabe qué archivos tienen terminaciones de línea de Windows ( 0x0D 0x0A
o /r /n
), ¿qué hará con esos archivos? Supongo que los convertirás en líneas finales de Unix ( 0x0A
o /n
). Puede convertir archivos con terminaciones de línea de Windows en terminaciones de línea Unix con la utilidad sed
, solo use el comando:
$> sed -i ''s//r//'' my_file_with_win_line_endings.txt
Puedes ponerlo en script así:
#!/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
Si lo ejecuta desde su directorio raíz con archivos, al final se asegurará de que todos los archivos tengan terminaciones de línea Unix.
Esta es la respuesta más segura. Stimms Answer no tiene en cuenta los subdirectorios y archivos binarios
find . -type f -exec file {} /; | grep "CRLF" | awk -F '':'' ''{ print $1 }''
- Use el
file
para encontrar el tipo de archivo. Aquellos con CRLF tienen ventanas que devuelven caracteres. La salida delfile
está delimitada por a:
y el primer campo es la ruta del archivo.