Convierta CRLF a avances de línea en Linux

34

¿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?

JoelFan
fuente
44
Dupe: superuser.com/questions/38744/… . El enlace proporcionado en la respuesta aceptada cubre las opciones dos2unix, perl y vi, entre otras.
Nagul
2
Esto ya tiene mejores respuestas, aunque (por lo que si una de ellas es que ser cerrado, lo que probablemente debería ser que uno)
Jonik

Respuestas:

40

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.

avelldiroll
fuente
2
+1 Mucho más útil que la respuesta "Usar dos2unix" más votada actualmente.
Jonik
1
Sí, incluso estoy votando este. La mía fue más una sugerencia de conducir.
Ryan C. Thompson
Daría una bonificación extra si dices cómo hacerlo recursivo. Actualmente solo funciona con comodines.
sorin
2
@SorinSbarnea: algo asífind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@Jonik, ¿qué lo hace "mucho más útil"? Pregunta seria
andrewtweber
24

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]
Ryan C. Thompson
fuente
2
y unix2dos para el otro lado.
quack quijote
Quack, ¿me estás siguiendo? No es que no lo aprecie, con todos los votos positivos.
Ryan C. Thompson, el
1
amigo, soy ~ charlatán. pronuncia "~" como "no". :) pero no, no te sigo, aunque parece que te encuentro con frecuencia.
quack quijote
1
Considere desarrollar cómo obtener esta utilidad para su sistema Linux. Al menos en Ubuntu no está instalado por defecto (pero al instalar el paquete tofrodos obtienes algo muy similar: packages.ubuntu.com/jaunty/tofrodos ).
Jonik
20

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!

quijote curandero
fuente
1
(uso inútil de cat and) perl es tan complicado como sed ... por lo tanto, no estás respondiendo realmente la pregunta, sino que estás acumulando reputación :) ''
akira el
2
La "mejor manera" es subjetiva. Esto funciona mejor para mí (estoy mucho más cómodo con Perl que sed). No prometí que funcionaría mejor para ti.
quack quijote
@akira: una pregunta puede tener múltiples respuestas válidas. También uso este método, ocasionalmente, principalmente en combinación con otros cambios, por lo que definitivamente es una respuesta válida; pero "usar dos2unix" es definitivamente la respuesta más práctica en la mayoría de las situaciones. Así que creo que las calificaciones están bien.
reinierpost
@akira: si lo encuentra más simple, publíquelo como respuesta e ilumine al resto de nosotros.
quack quijote
@ ~ quack: ese es el punto: no es más simple. Eso es lo mismo para su respuesta perl. u2d o fromdos / todos son las respuestas correctas porque son más simples que cualquier cosa expresada en cualquier otro lenguaje de programación.
akira el
9

Hago esto en Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
fuente
bonito. Vi otra mención de tr más temprano hoy. no es un programa que se menciona muy a menudo, ¿verdad?
quack quijote
7

Creo que también puedes usar tr(aunque no tengo archivos de formato divertidos para probar):

tr -d '\r' < file1 > file2
madriguera
fuente
4

En vi o Vim :

:%s/^V^M//g
fpmurphy
fuente
4

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.

Stefan Sjöberg
fuente
1
¿Podría editar su respuesta para aclarar qué configuración de alternar replicará el comportamiento solicitado por el OP?
Burgi
El OP quiere alternar las terminaciones de línea de DOS, entonces Alt+d. A veces, el programa terminal intercepta alt, por lo que puede usarlo esc+den su lugar.
spinup
1
Muchos atajos nano también funcionan con Shift presionado, lo que a menudo evita la intercepción de terminales, por lo que 'Alt-Shift-D' también funciona.
mwfearnley
3

Prefiero Vim y :set fileformat=unix. Si bien no es el más rápido, me da una vista previa. Es especialmente útil en el caso de un archivo con terminaciones mixtas.

opello
fuente
1

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\ncon \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.

Cabra descontento
fuente
Hay editores de texto, como jEdit, que pueden hacer estas transformaciones automáticamente; solo dígale si desea separadores de línea Unix, Windows o Mac.
Jonik
En realidad, KATE también puede hacerlo a través del menú Herramientas> Fin de línea . Quizá debería haber pensado más lateralmente que responder a la pregunta exactamente como estaba redactada - pero si usted sabe que usted desea específicamente para convertir \r\na \ncontinuación, mediante la búsqueda / reemplazo es más fácil de recordar qué usos OS cuales final de línea. ;)
DisgruntledGoat
1

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.

anatoly techtonik
fuente
1

CR LFpara LFusar 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).

1es el script que ejecuta awk. Un guión consta de condition { action }. En este caso, 1es 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}).


LFa 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
Martín
fuente
0

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 .

Tschallacka
fuente