¿Qué es `^ M` y cómo me deshago de él?


134

Cuando abro el archivo vim, veo ^Mcaracteres extraños .

Desafortunadamente, el motor de búsqueda favorito del mundo no funciona bien con caracteres especiales en las consultas, por lo que pregunto aquí:

  • ¿Qué es este ^Mpersonaje?

  • ¿Cómo pudo haber llegado allí?

  • ¿Como me deshago de esto?


3
Vlastimil que fue una edición sin sentido. Got es el tiempo pasado correcto de get en inglés británico.
Jesse_b

1
Es un dígrafo carácter de control, para más información: help digraph-table.
Eric Leschinski

Respuestas:


108

El ^Mes un personaje de retorno de carro. Si ve esto, probablemente esté viendo un archivo que se originó en el mundo DOS / Windows, donde un final de línea está marcado por un par de retorno de carro / nueva línea, mientras que en el mundo Unix, fin de línea está marcado por una sola línea nueva.

Lea este artículo para más detalles, y también la entrada de Wikipedia para nueva línea .

Este artículo describe cómo configurar vim para editar archivos de forma transparente con diferentes marcadores de fin de línea.

Si tiene un archivo ^Mal final de algunas líneas y desea deshacerse de ellas, use esto en Vim:

:s/^M$//

(Presione Ctrl+ V Ctrl+ Mpara insertar eso ^M).


11
Trate :%s/^M/\r/gen lugar de quitar ^My reemplazar ^Mcon el carácter de nueva línea \r. Sin %, el comando se aplica solo a la línea actual. Y me encontré con algunos ejemplos en los ^Mque no está al final de la línea, comoThe first line.^MThe second line.
George

O si no quieres un montón de saltos de línea, simplemente puedes hacerlo:%s/^M/
cuidado1 de

2
Si es solo un retorno de carro en sí mismo, ese podría ser el clásico salto de línea Macintosh (anterior a Unix). Incluso algunos programas más nuevos como Excel 2007 para Mac lo hacen por alguna razón.
sudo

@larsks Pero altap.cz/salamander/help/salamand/appendix_txtfiles dice que ^Mse usa en UNIX
Vivek

El artículo al que se ha vinculado dice que \nse usa en Unix, lo cual es correcto. Ese es el código ASCII 10, también conocido como ^J.
larsks

39

La mayoría de los sistemas operativos UNIX tienen una utilidad llamada dos2unixque convertirá el CRLF a LF. Las otras respuestas cubren la pregunta "qué son".


36

Una forma más sencilla de hacer esto es usar el siguiente comando:

dos2unix filename

Este comando también funciona con patrones de ruta, por ejemplo

dos2unix path/name*

Si no funciona, intente usar un modo diferente:

dos2unix -c mac filename
  • -cEstablecer el modo de conversión. Donde CONVMODE es uno de: ascii, 7bit, iso, maccon asciiser el predeterminado.

22

Esto funciono para mi

:e ++ff=dos 

El comando: e ++ ff = dos le dice a Vim que lea el archivo nuevamente, forzando el formato de archivo DOS. Vim eliminará las terminaciones de línea solo CRLF y LF, dejando solo el texto de cada línea en el búfer.

entonces

:set ff=unix 

y finalmente

:wq 

3
¡Gracias! esto funcionó para mí, pero la solución aceptada no
funcionó

¿Se ffrefiere al formato de archivo? ¿Qué hay de ++ff?
KcFnMi

El comando: e ++ ff = dos le dice a Vim que lea el archivo nuevamente, forzando el formato de archivo DOS. Vim eliminará las terminaciones de línea solo CRLF y LF, dejando solo el texto de cada línea en el búfer.
Stryker

10

Otra forma de deshacerse de los retornos de carro es con el trcomando.

Tengo un pequeño script que se ve así

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"

6

Puedes limpiar esto con sed:

sed -e 's/^M$//' < infile > outfile

El truco es cómo ingresar el retorno de carro correctamente. En general, debe escribir C-v C-mpara ingresar un retorno de carro literal. También puede tener trabajo sed en el lugar con

sed -i.bak -e 's/^M$//' infile

2

¿Qué es esto ^ M?
^ M es un carácter de retorno de carro. Si ve esto, probablemente esté viendo un archivo que se originó en el mundo DOS / Windows, donde un final de línea está marcado por un par de retorno de carro / nueva línea, mientras que en el mundo Unix, fin de línea está marcado por una sola línea nueva.

¿Cómo pudo haber llegado allí?
Cuando hay un cambio en el formato del archivo.

¿Como me deshago de esto?
abre tu archivo con

vim -b FILE_PATH

guárdelo con el siguiente comando

:%s/^M//g

Tienes un error tipográfico en abrir tu filtro con .
Mateusz Piotrowski

44
Esta respuesta no agrega nada a las otras respuestas. El primer párrafo es una copia casi literal de la respuesta aceptada. El código dado no guardará nada, solo eliminará todos los caracteres de retorno de carro de todas las líneas. Y no estoy seguro de cómo abrir el archivo en modo binario ayudará aquí.
Dubu

2

En mi caso,

Nada de lo anterior funcionó, tuve un archivo CSV copiado a la máquina Linux desde mi Mac y usé todos los comandos anteriores, pero nada ayudó excepto el siguiente

tr "\015" "\n" < inputfile > outputfile

Tenía un archivo en el que los caracteres ^ M estaban interceptados entre líneas, algo así como a continuación

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

0

Puede usar Vim en modo Ex:

ex -bsc '%s/\r//|x' file
  1. -b modo binario

  2. % seleccione todas las líneas

  3. s sustituir

  4. \r retorno de carro

  5. x guardar y cerrar


0

Agregue la siguiente línea a su ~ / .vimrc

command! Tounix :call Preserve('1,$s/^M//')

Luego, cuando tenga un archivo con las terminaciones de línea de Windows, ejecute el comando ": Tounix".


-1

En el pasado, he visto que incluso los archivos de configuración no se analizan correctamente y se quejan del espacio en blanco, pero si vi y hace una lista establecida, no mostrará el espacio en blanco, grep nombre de archivo [[espacio]] le mostrará ^ M

ahí es cuando dos2unix fileayuda


Esta respuesta no trae nada nuevo, does2unix ya se menciona al menos en dos respuestas mucho más antiguas.
Rui F Ribeiro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.