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

Cuando abro el archivo en Vim, veo caracteres ^M extraños.

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

  • ¿Qué es esto ^M carácter?

  • ¿Cómo pudo haber llegado allí?

  • ¿Cómo me deshago de él?

Comentarios

  • Es ‘ un dígrafo de caracteres de control, para más info: help digraph-table.
  • VS Code tiene una opción EOL en la parte inferior que convertirá automáticamente un archivo abierto.
  • @StackUnderflow al usar VSCode, es útil cambiar los finales de línea a LF cuando se trabaja en archivos Linux. Yo uso WSL … Un archivo de Windows como $ profile no tiene ningún problema con el archivo de Linux que termina LF. Quizás Win le gane a Linux aquí.

Respuesta

El ^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, el final de línea está marcado por una sola línea nueva.

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

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

Si tiene un archivo con ^M al final de algunas líneas y desea deshacerse de ellos, use esto en Vim:

:s/^M$// 

(Presione Ctrl + V Ctrl + M para insertar ese ^M.)

Comentarios

  • Pruebe :%s/^M/\r/g en su lugar para eliminar ^M y reemplazar ^M con el carácter de nueva línea . Sin %, el comando se aplica solo a la línea actual. Y encontré algunos ejemplos en los que ^M no está al final de la línea, como The first line.^MThe second line.
  • O si si no ‘ no quiere un montón de saltos de línea, podría hacer :%s/^M/
  • Si es ‘ es sólo un retorno de carro en sí mismo, que podría ser el clásico salto de línea de Macintosh (pre-Unix). Incluso algunos programas más nuevos como Excel 2007 para Mac lo hacen por alguna razón.
  • @larsks But altap.cz/salamander/help/salamand/appendix_txtfiles dice que ^M se usa en UNIX
  • No estoy seguro si ‘ es algo en mi configuración vim, ¡pero tengo que escribir Ctrl+Q, luego Ctrl+M para que ese carácter se genere!

Respuesta

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 
  • -c Establezca el modo de conversión. Donde CONVMODE es uno de: ascii, 7bit, iso, mac con ascii el valor predeterminado.

Comentarios

  • +1 para mencionar el valor predeterminado de la bandera -c y otras opciones. Al primer intento, el valor predeterminado no ‘ no tuvo los resultados esperados. Con dos2unix -c max funcionó. dos2unix: converting file launch_me.sh to Unix format...
  • Pequeña utilidad asombrosa. Para ubuntu solo apt-get install dos2unix. Si necesita usarlo de forma recursiva, puede consultar esta solución aquí: stackoverflow.com/questions/11929461/… Lo ejecuté tontamente en cada directorio manualmente y solo pensé en buscar después del hecho.

Responder

Esto funcionó para mí

: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á los finales de línea solo CRLF y LF, dejando solo el texto de cada línea en el búfer.

luego

:set ff=unix 

y finalmente

:wq 

Comentarios

  • ¡gracias! esto funcionó para mí, pero la solución aceptada no lo hizo
  • ¿ff se refiere al formato de archivo? ¿Qué pasa con ++ff?
  • El comando: e ++ ff = dos le dice a Vim que lea el archivo nuevamente, forzando el formato de archivo dos. Vim eliminará los finales de línea solo CRLF y LF, dejando solo el texto de cada línea en el búfer.
  • Para obtener más información sobre ff, ejecute «: help ff »
  • simple y eficaz . No estoy seguro de por qué cat file1 > > file2 está introduciendo dos líneas de alimentación cuando el archivo 1 no ‘ no lo tengo en primer lugar

Respuesta

La mayoría de los sistemas operativos UNIX tienen una utilidad llamada dos2unix que convertirá el CRLF a LF. Las otras respuestas cubren la pregunta «¿Qué son?».

Respuesta

Otra forma de deshacerse de los retornos de carro es con el tr comando.

Tengo un pequeño script que se ve así

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

Respuesta

Puede limpiar esto con sed:

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

El truco es cómo ingresar correctamente el retorno de carro. Generalmente, debe escribir C-v C-m para ingresar un retorno de carro literal. También puede hacer que sed funcione con

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

Responder

Sed in -place la solución sin necesidad de escribir el carácter especial (puede copiar esto y funciona):

sed -i -e "s/\r//g" filename 

Explicación:

-i: in-place -e: regular expression \r: escaped carriage return /g: replace globally 

Comentarios

  • El interrogador ya estaba editando el archivo con VIM, nota. Y ha habido una sed respuesta aquí desde 2012.
  • Sí, pero faltaba una buena solución que funcionara. La solución sed existente no ‘ no funciona de manera inmediata.
  • Dale Hagglund ‘ s en -place sed definitivamente funciona desde el primer momento.
  • Bueno, no para mí. Yo ‘ m en Ubuntu LTS 18.04.
  • Esto me ayudó a editar un archivo en Alpine Linux desde un escritorio de Windows que contaría Ctrl M como un retorno de línea, haciendo que las respuestas anteriores sean ineficaces.

Respuesta

¿Qué ¿es ^ M?
La ^ 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, el final de línea está marcado por una sola línea nueva.

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

¿Cómo me deshago de él?
abre tu archivo con

vim -b FILE_PATH 

guárdelo con el siguiente comando

:%s/^M//g 

Comentarios

  • Usted ‘ tiene un error tipográfico en abre su archivo con .
  • 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 proporcionado no guardará nada, solo eliminará todos los retornos de carro caracteres de todas las líneas. Y no estoy seguro de cómo abrir el archivo en modo binario elp aquí.

Responder

En mi caso,

Nada de lo anterior funcionó, tenía 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 ^ M caracteres fueron intercalados 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, 

Comentarios

  • mac2unix -n inputfile outputfile, o, de manera equivalente, dos2unix -c mac -n inputfile outputfile manejará esa situación.

Respuesta

Puede usar Vim en modo Ex:

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

  2. % seleccionar todas las líneas

  3. s sustituir

  4. \r retorno de carro

  5. x guardar y cerrar

Respuesta

Agrega la siguiente línea a tu ~ / .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».

Respuesta

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

que «s cuando dos2unix file ayuda

Comentarios

  • Esta respuesta no trae nada nuevo, does2unix ya se menciona al menos en dos respuestas mucho más antiguas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *