2009-10-05 16 views
10

Estoy intentando hacer lo contrario de this question, reemplazando terminaciones de línea Unix con terminaciones de línea de Windows, de modo que pueda use SQL Server bcp over samba to import the file. Tengo sed instalado pero no dos2unix. Traté de invertir los ejemplos, pero fue en vano.Reemplazar n con r n en el archivo Unix

Aquí está el comando que estoy usando.

sed -e 's/\n/\r\n/g' myfile 

ejecuté esto y luego corrió od -c myfile, esperando ver \r\n donde solía haber \n. Pero todavía hay \n. (O al menos parecen serlo. La salida de od desborda mi búfer de pantalla, por lo que no puedo ver el comienzo del archivo).

No he podido averiguar lo que estoy haciendo mal. ¿Alguna sugerencia?

+0

¿No tienes un compilador disponible? –

+0

¿Qué tipo de compilador? –

+0

para ver la parte superior del archivo: od -c nombre de archivo | menos –

Respuesta

11
  • ¿Cuál es el problema con conseguir dos2unix en la máquina?
  • ¿Cuál es la plataforma con la que está trabajando?
  • ¿Tiene GNU sed o no GNU regular sed?

En Solaris, /usr/bin/sed requiere:

sed 's/$/^M/' 

donde entré en el '^ M' escribiendo de controlVde controlM. El '$' coincide al final de la línea y reemplaza el final de la línea con el control-M. Puedes guiar eso, también.

mecanismos que esperan sed para ampliar '\r' o '\\r' para controlar-M van a ser específicos de la plataforma, en el mejor.

+0

Esto hizo el truco. Es posible que pueda obtener dos2unix allí, pero esperaba utilizar el software existente. Estoy en AIX. Supongo que es la versión que no es de GNU. Ahora que lo mencionas, he usado el control-v control-m truco en vi antes, debería haberlo pensado. Gracias. –

-1

Tal vez si se intenta de esta manera

cat myfile | sed 's/\n/\r\n/g' > myfile.win 

funcionará, de mi comprensión de su simplemente hacer los reemplazos a la salida de la consola, es necesario redirigir la salida a un archivo, en este caso myfile.win, entonces podrías cambiarle el nombre a lo que quieras. todo el guión sería (que se ejecuta dentro de un directorio completo de este tipo de archivos):

#!/bin/bash 
for file in $(find . -type f -name '*') 
do 
    cat $file | sed 's/\n/\r\n/g' > $file.new 
    mv -f $file.new $file 
done 
+1

-1. no funciona para mi – Peter

+0

bien es específico de la plataforma, la respuesta de Jonathan Leffler es mejor – Juparave

3

que no es necesario la opción -e.

$ coincide con el carácter de línea final. Este comando sed insertará un carácter \r antes del final de la línea:

sed 's/$/\r/' myfile 
+1

Gracias por la sugerencia, pero por alguna razón esto solo pega una r al final del archivo. –

+0

De acuerdo con el manual de información de GNU sed: "Todos los escapes introducidos aquí son extensiones de GNU, con la excepción de' \ n '. ". – hlovdal

+0

Mi culpa por no especificar el sabor de Unix. Estoy usando AIX. +1 por ser el primero en señalar que debería buscar $ en lugar de \ n. –

13

Cuando nos enfrentamos a esto, yo uso un simple perl de una sola línea:

perl -pi -e 's/\n/\r\n/' filename 

porque sed comportamiento varía, y sé que esto funciona.

+0

Sí, esta es la mejor opción portátil. Las expansiones^M y poco fiables introducidas a mano arriba son sorprendentes. –

1

Simplemente añadiendo una \r (también conocido como ^M, véase la respuesta de Jonathan Leffler) delante de \n no es seguro porque el archivo podría tener modo mixto EOL, por lo que entonces se arriesga a terminar con algunas líneas becomming \r\r\n. Lo más seguro es eliminar primero todos los caracteres '\ r' e insertar (uno) \r antes de \n.

#!/bin/sh 
sed 's/^M//g' ${1+"[email protected]"} | sed 's/$/^M/' 

Se actualizó para usar ^M.

0

Trate de usar:

echo " this is output" > input 
sed 's/$/\r/g' input |od -c 
1
sed 's/\([^^M]\)$/\0^M/' your_file 

Esto se asegura de que sólo se inserta una \ r cuando no hay \ r antes de \ n. Esto funcionó para mí.

Cuestiones relacionadas