¿Cuál es la forma más sencilla de eliminar todos los retornos de carro \r
de un archivo en Unix?
unix
carriage-return
Aldur
fuente
fuente
Respuestas:
Voy a asumir que los retornos de carro medias ( CR,
"\r"
,0x0d
) en los extremos de las líneas en lugar de a ciegas dentro de un archivo (que puede tener en el medio de cadenas por lo que sé). Usando este archivo de prueba con un CRal final de la primera línea solamente:dos2unix
es el camino a seguir si está instalado en su sistema:Si por alguna razón
dos2unix
no está disponible para usted,sed
lo hará:Si por alguna razón
sed
no está disponible para usted,ed
lo hará de manera complicada:Si no tiene ninguna de esas herramientas instaladas en su caja, tiene mayores problemas que tratar de convertir archivos :-)
fuente
\r
funciona solo con GNU sed, de lo contrario puede hacer esto:sed `echo "s/\r//"`
sed
tampoco loecho
reconozco\r
en MacOs. En este caso soloprintf "\r"
parece funcionar.sed "s/$(printf '\r')\$//"
$
manera:sed $'s@\r@@g' |od -c
(pero si lo reemplazara con\n
, necesitaría escapar)CTRL-V + CTRL-M
en lugar de\r
parece que podría funcionar.Ver tr (1)
fuente
tr
no admite el\r
escape, intente'\015'
o tal vez un literal'^M'
(en muchos shells en muchas terminales, ctrl-V ctrl-M producirá un carácter literal ctrl-M).outfile = infile
?someProg <in >out && mv out in
.Vieja escuela:
fuente
La forma más simple en Linux es, en mi humilde opinión,
Las comillas fuertes alrededor del operador de sustitución
's/\r//'
son esenciales . Sin ellos, el shell interpretará\r
como un escape + r y lo reducirá a un planor
, y eliminará todas las minúsculasr
. Es por eso que la respuesta dada por Rob en 2009 no funciona.Y agregar el
/g
modificador asegura que incluso múltiples\r
serán eliminados, y no solo el primero.fuente
Hay una utilidad llamada dos2unix que existe en muchos sistemas y se puede instalar fácilmente en la mayoría.
fuente
sed -i s/\r// <filename>
o algo así; verman sed
o la gran cantidad de información disponible en la web sobre el uso desed
.Una cosa a destacar es el significado preciso de "retorno de carro" en lo anterior; si realmente se refiere al carácter de control único "retorno de carro", entonces el patrón anterior es correcto. Si se refería, de manera más general, a CRLF (retorno de carro y avance de línea, que es cómo se implementan los avances de línea en Windows), entonces probablemente desee reemplazarlo
\r\n
. Los avances de línea desnuda (nueva línea) en Linux / Unix son\n
.fuente
s/\r//
no parece eliminar los retornos de carro en OS X, sino que elimina losr
caracteres literales . No estoy seguro de por qué eso es todavía. ¿Quizás tiene algo que ver con la forma en que se cita la cadena? Como solución alternativa, el usoCTRL-V + CTRL-M
en lugar de\r
parece funcionar.Si es un usuario de Vi, puede abrir el archivo y eliminar el retorno de carro con:
o con
Tenga en cuenta que debe escribir ^ M presionando ctrl-v y luego ctrl-m.
fuente
^M
-s en absoluto. Eludir esto es un montón de pulsaciones de teclas, que no es para lo que está hecho vim;). Simplemente iría porsed -i
, y luego '-e' s / \ r $ // g 'para limitar la eliminación a CR en EOL.Una vez más una solución ... Porque siempre hay una más:
Es agradable porque está en su lugar y funciona en todos los sabores de Unix / Linux con el que he trabajado.
fuente
Alguien más lo recomienda
dos2unix
y yo también lo recomiendo encarecidamente. Solo estoy proporcionando más detalles.Si está instalado, salte al siguiente paso. Si aún no está instalado, recomendaría instalarlo mediante
yum
:Entonces puedes usarlo como:
fuente
Si está utilizando un sistema operativo (como OS X) que no tiene el
dos2unix
comando pero tiene un intérprete de Python (versión 2.5+), este comando es equivalente aldos2unix
comando:Esto maneja ambos archivos con nombre en la línea de comando, así como tuberías y redireccionamientos, al igual que
dos2unix
. Si agrega esta línea a su archivo ~ / .bashrc (o un archivo de perfil equivalente para otros shells):... la próxima vez que inicie sesión (o se ejecute
source ~/.bashrc
en la sesión actual) podrá usar eldos2unix
nombre en la línea de comandos de la misma manera que en los otros ejemplos.fuente
Aquí está la cosa,
%0d
es el carácter de retorno de carro. Para que sea compatible con Unix. Necesitamos usar el siguiente comando.dos2unix fileName.extension fileName.extension
fuente
intente esto para convertir el archivo DOS en archivo Unix:
fuente
Para UNIX ... He notado que dos2unix eliminó los encabezados Unicode de mi archivo UTF-8. Bajo git bash (Windows), el siguiente script parece funcionar bien. Utiliza sed. Tenga en cuenta que solo elimina los retornos de carro al final de las líneas y conserva los encabezados Unicode.
fuente
Si está ejecutando un entorno X y tiene un editor adecuado (código visual de estudio), entonces seguiría la recomendación:
Código de Visual Studio: cómo mostrar finales de línea
Simplemente vaya a la esquina inferior derecha de la pantalla, el código de Visual Studio le mostrará tanto la codificación del archivo como la convención de final de línea seguida del archivo, y solo con un simple clic puede cambiar eso.
Simplemente use el código visual como su reemplazo para notepad ++ en un entorno Linux y ya está listo.
fuente
Notepad++
el comando 'sEdit / EOL Conversion / Unix (LF)
en su sistema Windows antes de copiar el archivo a su sistema Linux.Eliminación
\r
en cualquier sistema UNIX®:La mayoría de las soluciones existentes en esta pregunta son específicas de GNU y no funcionarían en OS X o BSD; las siguientes soluciones deben trabajar en muchos más sistemas UNIX, y en cualquier concha, de
tcsh
quesh
, aún así funcionar incluso en GNU / Linux, también.Probado en OS X, OpenBSD y NetBSD en
tcsh
, y en Debian GNU / Linux enbash
.Con
sed
:En
tcsh
un OS X, el siguientesed
fragmento podría usarse junto conprintf
, comosed
ni loecho
maneja\r
de manera especial como lo hace GNU:Con
tr
:Otra opción es
tr
:Diferencia entre
sed
ytr
:Parece que
tr
conserva la falta de una nueva línea final del archivo de entrada, mientras quesed
en OS X y NetBSD (pero no en OpenBSD o GNU / Linux) inserta una nueva línea final al final del archivo, incluso si falta la entrada final\r
o\n
al final del archivo.Pruebas:
Aquí hay algunas pruebas de muestra que podrían usarse para garantizar que esto funcione en su sistema, usando
printf
yhexdump -C
; alternativamente,od -c
también podría usarse si falta su sistemahexdump
:fuente
He usado Python para ello, aquí mi código;
fuente
Aunque es una publicación anterior, recientemente me encontré con el mismo problema. Como tenía que cambiar el nombre de todos los archivos dentro de / tmp / blah_dir / ya que cada archivo en este directorio tenía el carácter final "/ r" (mostrando "?" Al final del archivo), por lo que solo podía pensar en hacerlo en forma de script.
Quería guardar el archivo final con el mismo nombre (sin arrastrar ningún carácter). Con sed, el problema era el nombre de archivo de salida, que necesitaba mencionar algo más (que no quería).
Probé otras opciones como se sugiere aquí (no se considera dos2unix debido a algunas limitaciones) pero no funcionó.
Finalmente intenté con "awk", que funcionó donde usé "\ r" como delimitador y tomé la primera parte :
el truco es:
Debajo del fragmento de script que usé (donde tenía todos los archivos tenía "\ r" como carácter final en la ruta / tmp / blah_dir /) para solucionar mi problema:
Nota: Este ejemplo no es muy exacto, aunque cercano a lo que trabajé (Mencionando aquí solo para dar una mejor idea de lo que hice)
fuente
Hice este script de shell para eliminar el carácter \ r. Funciona en solaris y red-hat:
fuente
simplemente puedes hacer esto:
fuente
a * b
...