2008-09-15 17 views
87

Cuando ejecuto un script SQL particular en entornos Unix, estoy viendo un carácter '^ M' al final de cada línea del script SQL, ya que se repite en el línea de comando. No sé en qué sistema operativo se creó originalmente el script SQL.'^ M' carácter al final de las líneas

¿Qué está causando esto y cómo lo arreglo?

Respuesta

68

Es causado por los caracteres de final de línea DOS/Windows. Como dijo Andy Whitfield, el comando de Unix dos2unix ayudará a solucionar el problema. Si desea más información, puede leer las páginas man para ese comando.

+3

En algunos sistemas (es decir, Ubuntu) el nombre de este comando es "fromdos" – bobwienholt

+6

Puede obtener la herramienta en OSX muy fácil con 'brew install dos2unix' cuando tiene homebrew instalado – philipp

13

Pruebe usar dos2unix para quitar el^M.

7

El^M suele ser causado por las líneas nuevas del operador de Windows, y traducido a Unix se ve como un^M. El dos2unix comando debe eliminarlos bien

dos2unix [opciones] [-c convmode] [-o archivo ...] [-n archivoentrada archivo_salida ...]

8

la secuencia de comandos SQL se creó originalmente en un Windows OS. Los caracteres '^ M' son el resultado de que Windows y Unix tienen diferentes ideas sobre qué usar para un personaje de final de línea. Puedes usar Perl en la línea de comando para arreglar esto.

perl -pie 's/\r//g' filename.txt 
+0

Claro, usted PUEDE usar perl, pero ¿sugeriría perl sobre dos2unix? –

+2

Solo estoy ofreciendo una alternativa, ya que cuatro personas ya dijeron usar dos2unix. –

+2

Sí, encontré esto útil porque estoy en una estación de trabajo atrasada que trabaja en una oficina con un departamento de TI prehistórico. Excepto que utilicé una variación: perl -pi -e "s/\ x0D/\ n/g" file.csv – Rimian

9

En vi, hacer un :%s/^M//g

Para obtener el ^M sostenga el tecla CTRL, pulse V continuación M (Ambos mientras presiona la tecla Control) y aparecerá la ^M. Esto encontrará todas las ocurrencias y las reemplazará con nada.

+2

Para reemplazar el^M con un salto de línea amistoso de Unix: ':% s/^ M/\ r/g' –

39

La causa es la diferencia entre cómo un sistema operativo basado en Windows y un sistema operativo basado en Unix almacenan los marcadores de final de línea.

Los sistemas operativos basados ​​en Windows, gracias a su herencia de DOS, almacenan un final de línea como un par de caracteres: 0x0D0A (retorno de carro + avance de línea). Los sistemas operativos basados ​​en Unix solo usan 0x0A (a line feed). El ^M que está viendo es una representación visual de 0x0D (a carriage return).

dos2unix ayudará con esto. Probablemente también necesite ajustar la fuente de los guiones para que sea 'amigable para Unix'.

+0

No diría que las versiones actuales de Windows tienen ningún tipo de herencia de DOS * *. Sin embargo, todavía tienen restricciones de compatibilidad. – Joey

+0

Esta es la manera fácil, ¿es usted una herramienta de conversión automática? Gracias – peter

+0

¿Pero por qué '^ M'? ¿Por qué el '^'? ¿Por qué la 'M'? – uprego

24

La manera más fácil es usar vi. Sé que suena terrible pero es simple y ya está instalado en la mayoría de los entornos UNIX. El^M es una nueva línea del entorno Windows/DOS.

desde la línea de comandos: $ vi filename

A continuación, pulse ":" para llegar al modo de comando.

Buscar y reemplazar todo nivel mundial es :%s/^M//g "Mantenga oprimida la tecla de control a continuación, pulse V a continuación M" que sustituirá^M con nada.

Luego, para escribir y salir, ingrese ":wq" ¡Hecho!

+0

¿Cómo reemplazarlo en emacs? – herbertD

+0

¡Gracias! VI (M) es genial! –

+2

¡Gracias por la expansión de cómo escribir el carácter^M! Yo lo reemplazaría con \ r \ n en su lugar. Entonces lo hice:% s/^ M/\ r/g – aharris88

-1

Otro comando vi que hará: :%s/.$// Esto elimina el último carácter de cada línea en el archivo. El inconveniente de este comando de búsqueda y reemplazo es que no le importa cuál es el último carácter, así que tenga cuidado de no llamarlo dos veces.

+0

¿Por qué lo menciona si sabe que no es confiable? – minexew

5
C:\tmp\text>dos2unix hello.txt helloUNIX.txt 

Sed es aún más ampliamente disponible y se puede hacer este tipo de cosas también si dos2unix no está instalado

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt 

También puede probar tr:

cat hello.txt | tr -d \r > helloUNIX2.txt 

Estos son los resultados :

C:\tmp\text>dumphex hello.txt 
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha 
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A     ....haha.. 

C:\tmp\text>dumphex helloUNIX.txt 
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha.. 
00000010h: 68 61 68 61 0A         haha. 

C:\tmp\text>dumphex helloUNIX2.txt 
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha.. 
00000010h: 68 61 68 61 0A         haha. 
0

od -a $file es útil para explorar esos tipos de preguntas sobre Linux (similar a dumphex en lo anterior).

68

finales de línea Fix en vi ejecutando la siguiente:

:set fileformat=unix

:w

+2

Esta es una respuesta brillante. Muchas gracias. (guardado instalando dos2unix, una herramienta que probablemente solo use una vez) – Jamsi

+1

+1. Está muy limpio. –

+0

Funciona perfectamente. –

0

En Perl, si no desea establecer el $/variable y el uso chomp() que pueda también hacer:

$var =~ /\r\n//g; 

Mis dos centavos

4

Para reemplazar caracteres^M en vi usar editor continuación

abrir el archivo de texto decir t1.txt

vi t1.txt 

Entre en el modo de órdenes pulsando shift + :

a continuación, pulse las teclas como se mencionó %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M) 
+0

Su última línea es la que me faltaba en todas las respuestas anteriores. Seguí recibiendo 'no se encontraron coincidencias bc. Estaba haciendo shift + 6, así que hice lo que haría cada hacker y eludí mi malentendido con mi propia solución: grabar una macro para hacer $ para ir al final de cada línea y luego presionar x, simplemente repite la macro para un número de líneas en el archivo. – darethas

3

Una alternativa al comando dos2unix utilizaría las utilidades estándar lik e sed.

Por ejemplo, DOS a UNIX:

sed 's/\r$//' dos.txt > unix.txt 

UNIX a DOS:

sed 's/$/\r/' unix.txt > dos.txt 
0

Puede eliminar^M a partir de los archivos directamente a través de comando sed, por ejemplo:

sed -i'.bak' s/\r//g *.* 

Si está satisfecho con los cambios, elimine el.archivos bak:

rm -v *.bak 
Cuestiones relacionadas