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?
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.
Corrija los finales de línea en vi
ejecutando lo siguiente:
:set fileformat=unix
:w
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'.
La forma 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. 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!
Trate de usar dos2unix para quitar la ^ M.
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.
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
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 ...]
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.
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)
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
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
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
En Perl, si no desea establecer la variable $/y usar chomp () también puede hacer:
$var =~ /\r\n//g;
Mis dos centavos
od -a $file
es útil para explorar esos tipos de preguntas en Linux (similar a dumphex en lo anterior).