texto linea escribir editar crear como comandos caracter añadir archivo agregar scripting line-endings

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 del file está delimitada por a : y el primer campo es la ruta del archivo.