it-swarm-es.tech

Carácter '^ M' al final de las líneas

Cuando ejecuto una secuencia de comandos SQL en particular en entornos Unix, veo un carácter '^ M' al final de cada línea de la secuencia de comandos SQL que se repite en la línea de comandos. No sé en qué sistema operativo se creó originalmente el script SQL.

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

94
Paul Reiners

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

76
Thomas Owens

Corrija los finales de línea en vi ejecutando lo siguiente:

:set fileformat=unix

:w

73
Tim Abell

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 fin 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 + salto 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 retorno de carro ).

dos2unix ayudará con esto. Es probable que también necesite ajustar la fuente de los scripts para que sea 'compatible con Unix'.

39
ColinYounger

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

desde el indicador de comando: $ vi filename

Luego presione ":" para acceder al modo de comando.

Buscar y reemplazar todo a nivel mundial es :%s/^M//g " Mantenga presionado el control, luego presione V y luego M " que reemplazará ^ M con nada.

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

24
Bernie Perez

Trate de usar dos2unix para quitar la ^ M.

13
Andy Whitfield

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

Para obtener el ^M mantenga el CTRL tecla, pulse V entonces M (Ambos, mientras se mantiene presionada la tecla de control) y el ^M aparecerán. Esto encontrará todas las ocurrencias y las reemplazará con nada.

9
dogbane

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

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

El ^ M generalmente es causado por las nuevas líneas del operador de Windows y se traduce a Unix como un ^ M. El comando dos2unix debería eliminarlos muy bien.

dos2unix [opciones] [-c convmode] [-o archivo ...] [-n infile outfile ...]

7
jW.
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed está aún más disponible y 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 puedes probar tr:

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

Aquí están 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.  
5
JGurtz

Para reemplazar los caracteres ^ M en el editor vi use a continuación

abrir el archivo de texto decir t1.txt

vi t1.txt

Ingrese al modo de comando presionando shift + :

luego presione las teclas como se mencionó %s/^M/\r/g

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

Una alternativa al comando dos2unix sería usar utilidades estándar como sed.

Por ejemplo, dos a unix:

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

unix para hacer:

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

Convierta los finales de línea DOS/Windows (\ r\n) a finales de línea Unix (\ n), con tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Publicación sobre cómo reemplazar nuevas líneas desde la línea de comandos de Unix

1
Mason Wright

Puede eliminar ^ M de los archivos directamente mediante el comando sed, por ejemplo:

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

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

rm -v *.bak
1
kenorb

En Perl, si no desea establecer la variable $/y usar chomp () también puede hacer:

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

Mis dos centavos

0
Ariel Monaco

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

0
Allan Wind