¿Cuál es la mejor manera de convertir los CRLF en alimentaciones de línea en archivos en Linux?
He visto comandos sed , pero ¿hay algo más simple?
¿Cuál es la mejor manera de convertir los CRLF en alimentaciones de línea en archivos en Linux?
He visto comandos sed , pero ¿hay algo más simple?
Respuestas:
Usa este comando:
fromdos yourtextfile
Al revés:
todos yourtextfile
Estos comandos se encuentran en el paquete tofrodos (en las distribuciones más recientes), que también proporciona los dos envoltorios unix2dos y dos2unix que imitan las antiguas herramientas de unix del mismo nombre.
find . -name '*.txt' -print0 | xargs -null fromdos
Uso dos2unix
.
dos2unix - Convertidor de formato de archivo de texto DOS / MAC a UNIX
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Prefiero perl :
perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
Pero eso se adapta bien a mis usos, y es muy fácil para mí recordarlo. No todos los sistemas tienen un comando dos2unix, pero la mayoría en la que trabajo tienen un intérprete perl.
Otro es recode , un poderoso reemplazo para dos2unix e iconv; está disponible en el paquete "recode" en los repositorios de Debian:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
Para los fanáticos de awk :
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
... y sed :
sed 's/\r$//' winfile.txt > unixfile.txt
Y ahora, solo un poco menos complicado que borrar los CR a mano en un editor hexadecimal, directamente de uno de nuestros amigos de stackoverflow.com , utilizable con el intérprete de carne (ubicado en el repositorio Debian de su amigable vecindario),
dos2unix en brainfuck !
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
¡Muchas gracias a JK por perder una hora de su vida para escribir esto!
Hago esto en Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
Creo que también puedes usar tr
(aunque no tengo archivos de formato divertidos para probar):
tr -d '\r' < file1 > file2
Encontré una manera muy fácil ... Abrir archivo con nano: ## nano file.txt
presione Ctrl + O para guardar, pero antes de presionar Enter presione: Alt + D para alternar entre las terminaciones de línea de DOS y Unix / Linux, o: Alt + M para alternar entre las terminaciones de línea de Mac y Unix / Linux, luego presione Enter para guardar y Ctrl + X para salir.
Alt+d
. A veces, el programa terminal intercepta alt, por lo que puede usarlo esc+d
en su lugar.
Si desea un método GUI, pruebe el editor de texto Kate (otros editores de texto avanzados también pueden manejarlo). Abra el cuadro de diálogo buscar / reemplazar ( Ctrl+ R) y reemplace \r\n
con \n
. (Nota: tendrá que elegir "Expresión regular" en el menú desplegable y anular la selección de "Selección solamente" de las opciones).
EDIT: O, si lo único que desea convertir a formato Unix, a continuación, utilizar la opción de menú Tools
> End of Line
> Unix
.
\r\n
a \n
continuación, mediante la búsqueda / reemplazo es más fácil de recordar qué usos OS cuales final de línea. ;)
Pegue esto en el script de Python dos2unix.py .
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Debería funcionar en cualquier plataforma con Python instalado. Dominio publico.
CR LF
para LF
usar awk :
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
Ejemplo de uso:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
Explicación:
-v RS='\r?\n'
establece la variable RS ( input r ecord s eparator) en\r?\n
, lo que significa que la entrada se lee línea por línea separada por LF ( \n
) que puede ( ?
) ir precedida por CR ( \r
).
1
es el script que ejecuta awk. Un guión consta de condition { action }
. En este caso, 1
es la condición que se evalúa como verdadera. La acción se omite, por lo que se ejecuta la acción predeterminada, lo que significa imprimir la línea actual (que también podría escribirse como {print $0}
o simplemente {print}
).
LF
a CR LF
: Se puede establecer la variable ORS
( o utput r ECORD s eparator) para modificar los extremos de la línea de la salida. Ejemplo:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Usé este script para archivos que necesitaba para transferir archivos de emergencia de un sistema Windows a un sistema Unix.
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
Encuentra todos los archivos, recursivamente, en el directorio desde el que ejecuta el comando
xargs file
Páselo al programa de archivo para obtener un análisis del archivo.
grep CRLF
Solo queremos la salida del archivo que muestra CRLF.
cut -d: -f1
Obtenga la salida hasta el color. descarta el resto. Solo deberíamos tener un nombre de archivo ahora
xargs dos2unix
Pase el nombre del archivo al programa dos2unix usando xargs .