¿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'?

ByteNirvana
fuente
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:

134

Esto es lo único que funcionó para mí:

: e ++ ff = dos

Lo encontré en: http://vim.wikia.com/wiki/File_format

Pam
fuente
Trabajó en windows7 Vim7.4
consulta el
19
:e ++ff=dosseguido por :set ff=unixconvertirá las terminaciones a un formato cuerdo.
Mateen Ulhaq
La respuesta de la solución no funcionó para mí, solo los comandos @MateenUlhaq me ayudaron.
Edenshaw
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).

LeopardSkinPillBoxHat
fuente
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.

Paul Tomblin
fuente
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).

Jonathan Leffler
fuente
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.

netpoetica
fuente
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.

chenxsan
fuente
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.

Metagrafo
fuente
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).

d -_- b
fuente
¡¡Golpear!! Funciona en Mac
shamail
17

^ M es recuperado por Ctrl+ Vy M, también

s/^M//g
Andrew Sledge
fuente
15

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

BHarman
fuente
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
13

Algo simple que funcionó para mí

dos2unix   filename
Shahzeb Khan
fuente
12

Hice esto con sed:

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

Freedom_Ben
fuente
¿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.

tonatiuhnb
fuente
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
Micah Smith
fuente
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.

CrannDarach
fuente
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
Stryker
fuente
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,
Vishwanath gowda k
fuente
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.

Preocupado por TunbridgeWells
fuente
5
sed s/^M//g file1.txt > file2.txt

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

Diamante azul
fuente
4

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

Ramesh
fuente
Nunca he oído hablar de mac2unix antes, ¡hubiera votado de nuevo si pudiera!
Kuf
Huray! ¡Este es el camino a seguir!
Privado
3

Use uno de estos comandos:

:%s/\r//g

O

:%s/\r\(\n\)/\1/g
Muhammad Reda
fuente
2

Esto funcionó para mí:

:% s/\r\n/\r
Cambio de contexto
fuente
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>
agouge
fuente
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

rogermushroom
fuente
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.

Shravan Kumar
fuente
1

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

sed 's/\r//g'
Manoj Kumar
fuente
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!

falcucci
fuente
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.

Nitin Nain
fuente
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()
SergioAraujo
fuente
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

usuario1997684
fuente