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
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, comoThe 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
, luegoCtrl+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
conascii
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 sí 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
-
-b
modo binario -
%
seleccionar todas las líneas -
s
sustituir -
\r
retorno de carro -
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.
help digraph-table
.