¿Cómo agregar un retorno de carro antes de cada nueva línea?

28

Tengo un archivo que solo se usa \npara nuevas líneas, pero necesito que lo tenga \r\npara cada nueva línea. ¿Cómo puedo hacer esto?

Por ejemplo, lo resolví en Vim usando :%s/\n/\r\n/g, pero me gustaría usar un script o una aplicación de línea de comandos. ¿Alguna sugerencia?

Intenté buscar esto con sedo grep, pero las soluciones alternativas de la secuencia de escape me confundieron de inmediato (estoy un poco verde con estos comandos).

Si está interesado, la aplicación está relacionada con mi pregunta / respuesta aquí

modulitos
fuente

Respuestas:

36

Puede usar unix2dos (que se encuentra en Debian):

unix2dos file

Tenga en cuenta que esta aplicación no insertará una CRantes de cada LF, sólo ante esas LFs que no están precedidos por una (y sólo una) CRy ignorará los archivos binarios (los que contienen valores de bytes en el 0x0 -> 0x1f van distinta LF, FF, TABo CR)

o usar sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

o usar awk:

awk '{printf "%s\r\n", $0}' file

o usar perl:

perl -pe 's|\n|\r\n|' file
Cuonglm
fuente
Tenga en cuenta que unix2dox no insertará un CRantes de cada LF, solo antes de aquellos LF que no estén precedidos por un (y solo uno) CR.
Stéphane Chazelas
@ StéphaneChazelas: Gracias por el punto, lo agregué a mi respuesta.
Cuonglm
1
La información clave que utilicé aquí '\r'con sedhace el truco.
rkersh
8

Esto es exactamente lo que unix2doshace:

$ unix2dos file.txt

Eso reemplazará file.txten el lugar con una versión con terminaciones de línea CRLF.

Si desea hacerlo sed, puede insertar un retorno de carro al final de cada línea:

sed -e 's/$/\r/' file.txt

Esto reemplaza ( s) el área de tamaño cero justo antes del final de la línea ( $) con \r. Para hacer un reemplazo en el lugar (como lo unix2doshace), use sed -i.bak, aunque esa es una extensión no estándar; si no la tiene, use un archivo temporal.

Michael Homer
fuente
3
El uso \ren reemplazo no es portátil. Al menos, no funcionará en Mac OSX.
Cuonglm
Tenga en cuenta que hay varias implementaciones de unix2dos. Es posible que desee dar un enlace a la página de inicio de una implementación específica (como waterlan.home.xs4all.nl/dos2unix.html como se encuentra en Debian) en lugar de linux.die.net/man que no deja en claro qué La implementación (o versión) está documentada. Tenga en cuenta que hay algunos u2d, ux2dos, todosordena alrededor también.
Stéphane Chazelas
2

Si está realizando la conversión en una máquina Unix (OS X, Linux), abra el archivo con vio vim:

$ vim my-file

presione la tecla ESC para asegurarse de que no está en modo de inserción, luego escriba

:set ff=dos

o

:set fileformat=dos

Esto hace la conversión en su lugar al configurar el formato de archivo.

Para escribir el archivo y salir del editor, use

:wq

En la línea de comando puedes hacer

$ vi +':w ++ff=dos' +':q' my-file
Peter Evans
fuente
gracias por explicar todos los pasos: para un novato, es mucho más fácil entender lo que está sucediendo.
user3616725
2

Hacer esto con POSIX es complicado:

  • POSIX Sed no es compatible con \ro \15. Incluso si lo hiciera, la opción en el lugar -ino es POSIX

  • POSIX Awk es compatible \ry \15, sin embargo, la -i inplaceopción no es POSIX

  • d2u y dos2unix no son utilidades POSIX , pero ex es

  • POSIX ex no soporta \r, \15, \no\12

Para eliminar retornos de carro:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

Para agregar retornos de carro:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Steven Penny
fuente
1

Una función de shell portátil que hará esto:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Con eso puedes hacer:

u2dos file >dosfile
mikeserv
fuente
1

En awk puedes intentar

awk '{print $0 "\r"}'

O

awk -v r=$'\r' '{print $0 r}'

El $'\r'es un ejemplo de estilo ANSI-C citando como soportado por unos cáscaras como ksh93, bash, zsh, mkshy FreeBSD sh y es probable que se incluirán en cuestión 8 de la Single Unix Specification .

Ofrece una forma general de expresar caracteres extraños, prueba esto, por ejemplo:

awk -v r=$'\U0001F608' '{print $0 r}'
trepanger
fuente