¿Cómo convertir el salto de línea ^ M a salto de línea 'normal' en un archivo abierto en vim?


481

vim se muestra en cada línea que termina ^ M

¿Cómo hago para reemplazar esto con un salto de línea 'normal'?



3
Cambie la solución al cambio de formato de archivo porque esa es la solución más limpia.
erikbwork

1
Sé que esta pregunta es sobre vim, pero algunas otras búsquedas de Google también llegan a este hilo. Entonces, si tiene Eclipse instalado en su sistema, puede convertir el delimitador de línea para un solo archivo o un árbol de carpetas completo con unos pocos clics: stackoverflow.com/a/7019737/1364747
Teddy

Me gusta cómo llamas "saltos de línea normales" a diferencia de esos ^ M saltos de línea :-)
DerMike

Respuestas:



577

Mando

:%s/<Ctrl-V><Ctrl-M>/\r/g

Donde <Ctrl-V><Ctrl-M>significa tipo Ctrl+ Vluego Ctrl+ M.

Explicación

:%s

sustituto,% = todas las líneas

<Ctrl-V><Ctrl-M>

^ M caracteres (Ctrl-V es una forma Vim de escribir el carácter Ctrl ^ y Ctrl-M escribe la M después de la expresión regular, dando como resultado el carácter especial ^ M)

/\r/

con nueva línea ( \r)

g

Y hágalo globalmente (no solo la primera aparición en la línea).


21
eliminó los caracteres ^ M pero no inserta el retorno de carro.
luckytaxi

14
@jumpnett: debe presionar los acordes clave Ctrl-V / Ctrl-M, no ingresarlo como texto literal.
LeopardSkinPillBoxHat

33
Esta es definitivamente la respuesta correcta para la pregunta, si tiene una ^ M seguida de una nueva línea, desea mantener la nueva línea pero eliminar la ^ M. Al hacer la otra sustitución a continuación, se duplican los espacios del archivo.
dlamblin

12
Si todavía falta un retorno de carro (es decir, se ha eliminado la ^ M pero todo está envuelto en una sola línea), haga lo siguiente: :%s/<Ctrl-V><Ctrl-M>/\r/g(donde \ r reemplaza la ^ M con una nueva línea).
William Turrell

77
Si está ejecutando Vim en Windows, deberá usar <Ctrl-Q> en lugar de <Ctrl-V>.
GrandAdmiral

418

En Linux y Mac OS, los siguientes trabajos,

:%s/^V^M/^V^M/g

donde ^V^Msignifica tipo Ctrl+ V, luego Ctrl+ M.

Nota: en Windows probablemente desee usar en ^Qlugar de ^V, ya que de forma predeterminada ^Vestá asignado para pegar texto.


3
¿Por qué esto recibió un voto negativo? Funciona, incluso cuando su archivo se mezcla en una línea porque tiene el final de línea incorrecto.
Paul Tomblin

2
No. Mi camino reemplaza el final de línea en el archivo con el final de línea correcto.
Paul Tomblin

77
Esto es para un problema diferente cuando su archivo NO tiene nuevas líneas, lo cual admito es más común. FYI ^ M puede ser igualado por \ r
dlamblin

12
Este es un comando profundamente misterioso, pero funciona para mí en una Mac.
Eric Walker

55
Encontré que el equivalente %s/\r/\r/gfuncionó bien en MacVim para un archivo que se muestra solo ^Mal final de las líneas (una línea larga en términos de MacVim). Claramente, \ r significa cosas diferentes en el patrón frente a las partes de reemplazo de este comando.
RichVel

184

Dentro vim, mira el formato de archivo: DOS o Unix:

:set filetype=unix

:set fileformat=unix

El archivo se volverá a escribir sin caracteres de retorno de carro (CR, ^ M).


3
use: set fileformat = unix Para la mayoría de las configuraciones, el tipo de archivo solo cambia el tipo de sintaxis que se utiliza.
derGral

66
Esto solucionó el error que estaba teniendo ... Vim comenzó a pensar que mi archivo con formato UNIX era windows y las líneas recién cambiadas mostraban ^ M en el git diff.
Thomas Hunter II

Debe ser dependiente del sistema. Hoy, este funcionó. El comando set se realiza dentro de vim, por cierto.
gbarry

1
¡genial! porque el formato de archivo es dos, configúrelo para que sea unix, y está bien
zhaozhi

3
Esto también funciona en vi BTW, y puede hacer set ff=unixun pequeño atajo de la misma manera que ftes un atajo parafiletype
Posva

110

Un archivo que había creado con BBEdit visto en MacVim mostraba un montón de ^Mretornos de línea en lugar de los regulares. El siguiente reemplazo de cadena resolvió el problema; espero que esto ayude:

:%s/\r/\r/g

Es interesante porque estoy reemplazando los saltos de línea con el mismo carácter, pero supongo que Vim solo necesita obtener un nuevo \ r para mostrarse correctamente. Me interesaría saber la mecánica subyacente de por qué esto funciona.


1
Las funciones de búsqueda tienden a aceptar reglas más amplias para reconocer secuencias de fin de línea. Pero \ r tiene un significado específico cuando se escribe como datos.
gbarry

Esto funcionó para mí en Windows gVim para ordenar un archivo que no tenía saltos de línea, solo muchos ^ M en su lugar.
Flash

2
De todas las soluciones ofrecidas en esta página, este fue el único patrón que funcionó para mí al eliminar ^ M de un archivo csv. Usando MacVim.
B6431

+1 También funcionó para mí mientras usaba SSHing para Ubuntu Trusty desde Windows usando Mobaterm
Carl

Entonces, esto parecía reemplazar a todos los \rpersonajes a \npesar de especificar \rcomo reemplazo. No me quejo, eso es exactamente lo que quería. Solo raro.
donut

34

Primero, use :set ff?para averiguar el formato de archivo que tiene su archivo.

Supongo que podría ser unix, entonces el problema es que su archivo se creó fileformat=dosagregando "^ M ^ J" al final de la línea, pero se leyó con flieformat=unixsolo quitar la "^ J" del final de la línea, dejando la "^ M" allí.

Simplemente ingrese :e ++ff=dosen la línea de comando de Vim para cambiar el formato de su archivo de unix a dos. Debería resolver el problema. Si no, :%s/\r//gdebería ayudarte.


3
Tuve que hacer las dos cosas. :e ++ff=dosentonces :set ff=unixy:w
Max

29

para que el carácter ^ M coincida, tuve que seleccionarlo visualmente y luego usar el comando Copiar del SO al portapapeles para recuperarlo. Puede probarlo haciendo una búsqueda del personaje antes de probar el comando reemplazar.

/^M

debe seleccionar la primera línea incorrecta

:%s/^M/\r/g

reemplazará todos los ^ M errantes con retornos de carro.

Esto es como funciones en MacVim, que se basa en gvim 7.

EDITAR:

Tener este problema nuevamente en mi máquina con Windows 10, que tiene Ubuntu para Windows, y creo que esto está causando problemas de formato de archivo para vim. En este caso, cambiar el ff a unix, mac o dos no hizo más que cambiar ^ M a ^ J y viceversa.

La solución en este caso:

:%s/\r$/ /g
:%s/ $//g

La razón por la que tomé esta ruta es porque quería asegurarme de que no estaba siendo destructivo con mi archivo. Podría haberlo hecho, :%s/\r$//gpero eso habría eliminado los retornos de carro de inmediato, y podría haber tenido resultados inesperados. En su lugar, convertimos el carácter CR singular, aquí un carácter ^ M, en un espacio, y luego eliminamos todos los espacios al final de las líneas (lo que para mí es un resultado deseable independientemente)

Perdón por revivir una vieja pregunta que ha sido respondida desde hace mucho tiempo, pero parecía haber cierta confusión y pensé que podría ayudar a aclarar algo de eso, ya que esto está en lo más alto de las búsquedas de Google.


1
presionar ctrl-v ctrl-m puede funcionar para insertar el carácter, también, fwiw. pero el \ r es lo que inserta el retorno de carro adecuado.
Metagrapher

1
Esta es la respuesta correcta. Como se dijo anteriormente, use <ctrl-v> <ctrl-m> para obtener el ^ M literal insertado en el comando.
carlosayam

1
Estoy de acuerdo, aunque estoy seguro de que si eso hubiera funcionado para mí en el momento de la publicación original, entonces no habría publicado. ;)
Metagrapher

22

Ninguno de estos funcionó para mí, así que probé esto, que funcionó:

tipo :%s/

prensa CTRL-VCTRL-M

tipo //g

prensa Enter

Entonces el comando general en Vim debería verse como :%s/^M//g

Lo que esto hace: :%s(buscar y reemplazar) /^M/(ese símbolo) /(sin caracteres) g(globalmente).


¡¡Golpear!! Funciona en Mac
shamail


15

Sin necesidad de usar Ctrl: :%s/\r$//


1
Así es como lo hago yo también. Nunca recuerdo el comando
pixel 67

Esta es la forma recomendada para eliminar estas terminaciones.
Metagrapher


12

Hice esto con sed:

sed -i -e 's/\r/\n/g' filename


¿Estás seguro de que esto funciona? En OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Sí, funciona (lo uso mucho), pero en OSX si no tiene instalada la versión GNU de sed, puede que no funcione. La versión de sed que Apple envía por defecto es muy diferente (lamentablemente) que la versión de GNU que se distribuye en todas las distribuciones de Linux. Consulte la respuesta a esta pregunta para obtener más ayuda: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Gracias @Freedom_Ben. Entonces parece que esto funciona para GNU sedpero no para BSD sedentonces (como se encuentra en OSX). Cualquiera que arregle saltos de línea probablemente esté trabajando con una combinación de sistemas operativos, por lo que es útil tener claro cuándo funcionará la respuesta.
Armand

10

¿Qué pasa con :%s/\r//g eso ? Eso funcionó totalmente para mí.

Lo que esto hace es simplemente limpiar el final de la línea de todas las líneas, elimina el ^ M y listo.


9

Hay muchas otras respuestas a esta pregunta, pero aún así, las siguientes funcionan mejor para mí, ya que necesitaba una solución de línea de comandos:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Explicación:

  • Sin cargar ningún archivo .vimrc, abra myfile
  • Ejecutar :e ++ff=dospara forzar una recarga de todo el archivo como terminaciones de dos líneas.
  • Ejecutar :w ++ff=unixpara escribir el archivo usando terminaciones de línea unix
  • Salir de vim

3
¡gracias! esto solucionó mi problema y lo encontré útil para usar en scripts
Peddipaga

8

Ctrl+ Mminimiza mi ventana, pero Ctrl+ Enterrealmente inserta un ^Mcarácter. También tenía que asegurarme de no levantar la Ctrltecla entre pulsaciones.

Entonces la solución para mí fue:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Donde <Ctrl-V><Ctrl-Enter>significa mantener Ctrl presionado, presionar y soltar V, presionar y soltar Enter, y luego soltar Ctrl .

Si está trabajando en un archivo generado por Windows

La solución anterior agregará una línea adicional entre las líneas existentes, porque ya hay un invisible \rdespués de ^M.

Para evitar esto, desea eliminar los ^Mcaracteres sin reemplazarlos.

:%s/<Ctrl-V><Ctrl-Enter>//g

Donde %significa "en este búfer", ssignifica "sustituto", /significa "(buscar) el siguiente patrón", se <Ctrl-V><Ctrl-Enter>refiere a las teclas para presionar para obtener el ^Mcarácter (ver arriba), //significa "sin nada" (o "con el patrón entre estas dos barras, que está vacío "), y ges una bandera que significa" globalmente ", en oposición a la primera aparición en una línea.


7

Esto funcionó para mí:

  1. Establecer el formato de archivo en unix ( \nfinal de línea)
  2. guarda el archivo

Entonces en vim:

:set ff=unix
:w

1
Este funcionó para mí, mientras que la respuesta aceptada no.
Marcello Romani

7

En mi caso,

Nada de lo anterior funcionó, tuve un archivo CSV copiado a la máquina Linux desde mi mac y utilicé 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 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,

5

Alternativamente, hay utilidades de código abierto llamadas dos2unix y unix2dos disponibles que hacen esto mismo. En un sistema Linux probablemente estén instalados por defecto; para un sistema Windows, puede descargarlos desde http://www.bastet.com/ entre otros.


5
sed s/^M//g file1.txt > file2.txt

donde ^ M se escribe presionando simultáneamente las 3 teclas, ctrl + v + m


4

use la utilidad dos2unix si el archivo se creó en Windows, use la utilidad mac2unix si el archivo se creó en mac. :)


Nunca he oído hablar de mac2unix antes, ¡hubiera votado de nuevo si pudiera!
Kuf

Huray! ¡Este es el camino a seguir!
Privado



1

Para guardar las pulsaciones de teclas , puede evitar escribir Ctrl+ VCtrl+ Mcolocando esto en una asignación. Simplemente abra un archivo que contenga un carácter ^ M, tírelo y péguelo en una línea como esta en su .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>

1

Ninguna de estas sugerencias funcionó para mí, ya que logré obtener una gran cantidad de ^Msaltos de línea mientras trabajaba con vim y eclipse. Sospecho que encontré un caso externo, pero en caso de que ayude a alguien que lo hice.

:%s/.$//g

Y resolvió mi problema


Esto eliminará CUALQUIER carácter al final de una línea. Si tiene una línea que, por algún motivo, no termina con ^ M, también eliminará ese carácter y sería inesperado. Este no debería ser el caso, pero en el caso de que lo sea, y usted no lo sepa, podría manchar su archivo de una manera muy difícil de identificar.
Metagrapher

1
:g/^M/s// /g

Si escribe ^Musando Shift+6 Caps+Mno lo aceptará.

Tiene que escribir ctrl+v ctrl+m.


1

^Mda saltos de línea no deseados. Para manejar esto, podemos usar el sedcomando de la siguiente manera:

sed 's/\r//g'

idk por qué esto fue votado a -1 ... porque usa sed? puedes hacer la misma sustitución dentro de vim y debería funcionar
Metagrapher

1

Simplemente elimine set binaryen su .vimrc!


En otro hilo, se recomendó "establecer binario" para deshacerse de la inserción automática de una nueva línea.
dexter2305

1

Para usar seden MacOS, haga esto:

sed -i.bak $'s/\r//' <filename>

Explicación: La $'STRING'sintaxis aquí pertenece al shell bash. Las Mac no se tratan \rcomo caracteres especiales. Al citar la cadena de comando en, $''le está diciendo al shell que reemplace \rcon el \rcarácter real especificado en el estándar ANSI-C.


0

"Esta función conserva la lista de saltos

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

En este caso, ¿qué tiene de malo usar el comando dos2unix nativo de * NIX? linux.die.net/man/1/dos2unix
Metagrapher

0

Pasé una tarde luchando con \ n ctrl-v 012 (los cuales me proporcionan nulo). y trabajé a través de este hilo hasta que llegué al metagrafo.

\r funcionó bien para mí!

/),/s/),/)\r/g

convertido algo como esto:

blacklist-extra: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,

en algo como esto:

26 libwv-1.2-4: i386 (1.2.9-3, automático)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, automático)
28 jed: i386 (0.99.19-2.1)

Magia. Estoy profundamente agradecido

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.