Convierta finales de línea de DOS a finales de línea de Linux en vim


717

Si abro los archivos que creé en Windows, todas las líneas terminan en ^M.
¿Cómo elimino todos estos caracteres a la vez?


Si haces un hexdump -C badfiley ves 0x0d 0x0a "\r\n"que ese es tu problema.
Yzmir Ramirez

Respuestas:


1075

dos2unix es una utilidad de línea de comandos que hará esto, o lo :%s/^M//ghará si usa Ctrl- v Ctrl- mpara ingresar ^ M, o puede :set ff=unixy vim lo hará por usted.

Los documentos sobre la configuración de 'formato de archivo' están aquí , y el wiki de vim tiene una página completa sobre conversiones de finalización de línea .

Alternativamente, si mueve archivos de un lado a otro, es posible que no desee convertirlos, sino más bien hacerlo :set ff=dos, por lo que vim sabrá que es un archivo de DOS y usará convenciones de DOS para los finales de línea.


56
:%s/^M//gdebería serlo :%s/\r//g, porque ^Msolo significa "M mayúscula" al principio de la línea ".
Bunyk

78
No si haces lo que dice la respuesta y 'usa ctrl-v ctrl-m para ingresar el ^ M'.
pjz

2
crtl-v no es bueno, en Windows pega el contenido del portapapeles en la línea de comando. La solución :%s/\r//gfuncionó para mí, saludos @Bunyk
roblogic

3
@ropata Lo que quieres en Windows es ctrl-q .
ruffin

2
Debo estar perdiendo algo, porque set ff=unixno hace nada. Tal vez convierte el archivo, pero todos los ^Mpersonajes siguen ahí.
Felwithe

276

Cambie las terminaciones de línea en la vista:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Esto también se puede usar como operación de guardado (: solo w no guardará usando las terminaciones de línea que ve en la pantalla):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

Y puede usarlo desde la línea de comandos:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

44
Muchas gracias. Intenté vi + ': wq ++ ff = unix' <filepath> para una persona perezosa como yo.
a_secenthusiast

2
Esta debería ser la respuesta más votada. :w +ff=unixes mucho mejor que la mayoría de las otras cosas escritas aquí, y el script bash es una buena ventaja.
mkasberg

Los :ecomandos no parecen hacer nada en mi instalación de Windows vim. Mi vista todavía muestra los ^Mcódigos.
Grant Birchmeier

160

Yo suelo usar

:%s/\r/\r/g

lo que parece un poco extraño, pero funciona debido a la forma en que vim coincide con los avances de línea. También me resulta más fácil recordar :)


99
Esto funciona de manera consistente en todas las plataformas. La mejor respuesta aquí.
thebigjc

44
Nunca he tenido ningún problema :set ff=unixantes, pero el archivo que abrí hoy debe haber sido particularmente extraño. Vim dijo que ya estaba fileformat=unixpero que todos los finales de línea sí ^M. Esta solución funcionó para mí.
Chris B

15
Esta solución agrega líneas adicionales no deseadas para mí, duplicando el número de líneas en el archivo. :%s/\r//gen cambio funciona para mí.
Victor Zamanian

3
Victor, tus archivos probablemente tienen \ r \ n terminaciones. la \ r no se lee como una nueva línea pero la \ n sí. En los archivos con los que me estoy encontrando son \ r y tienes que agregar un carácter de nueva línea.
Joeyjoejoejr

2
@ VictorZamanian's :%s/\r//ges la única solución de uso general, especialmente para archivos de modo mixto que contienen una mezcla heterogénea de líneas nuevas de estilo DOS y UNIX. Las soluciones canónicas (por ejemplo, :set ff=unix, :e ++ff=unix) asumen cada línea de los extremos del búfer actual en el mismo estilo de nueva línea. A veces lo hacen; a veces no lo hacen. Cue sadface.
Cecil Curry

97

Prefiero usar el siguiente comando:

:set fileformat=unix

También puede usar maco dospara convertir su archivo a macintosh o convención de archivos MS-DOS / MS-Windows respectivamente. Y no hace nada si el archivo ya está en el formato correcto.

Para obtener más información, consulte la ayuda de vim:

:help fileformat

1
Este comando no parece hacer nada en mi Windows vim. Mi punto de vista todavía tiene ^Mcaracteres.
Grant Birchmeier

Agregar set fileformat=unixa mi archivo .vimrc funcionó.
Joey Allen

20

:set fileformat=unix para convertir de dos a unix.


1
Esto realmente resolvió el problema para mí. No pude encontrar esos personajes mientras buscaba.
Capitán Insaneo

20
:%s/\r+//g

En Vim, eso elimina todos los retornos de carro y deja solo nuevas líneas.


2
Por alguna razón anterior no funcionó para mí en Windows gvim. Pero cuando se cambió :%s/\r//g, funcionó a las mil maravillas.
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3


10

Convierte el directorio de archivos de DOS a Unix

Usando la línea de comando y sed, busque todos los archivos en el directorio actual con la extensión ".ext" y elimine todos los "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

también, como se mencionó anteriormente ^ M = Ctrl+V+ Ctrl+M(no solo escriba el símbolo de intercalación "^" y M)


9

dos2unix puede modificar directamente el contenido del archivo.

Puede usarlo directamente en el archivo, sin necesidad de redireccionar el archivo temporalmente.

dos2unix input.txt input.txt

Lo anterior utiliza el supuesto teclado estadounidense. Use la -opción 437 para usar el teclado del Reino Unido.

dos2unix -437 input.txt input.txt



6

Con el siguiente comando:

:%s/^M$//g 

Obtener el ^Mtipo de aparecer CtrlVentonces CtrlM. CtrlVle dice a Vim que tome el siguiente personaje ingresado literalmente.


6

El comentario sobre cómo hacer que aparezca la ^ M es lo que funcionó para mí. Simplemente escribiendo "^ M" en mi vi no tengo nada (no encontrado). Sin embargo, la secuencia CTRL+ V CTRL+ lo Mhizo perfectamente.

Mi comando de sustitución de trabajo fue

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

y se veía así en mi pantalla:

:%s/^M/\r/g

44
Puedes usar en :%slugar de :1,$s. %es la abreviatura 1,$.
The Tin Man

5

Encontré una manera muy fácil: abrir el archivo con nano: nano file.txt

Presione CTRL+ Opara guardar, pero antes de presionar Enter, presione: ALT+ Dpara alternar entre las terminaciones de línea de DOS y Unix / Linux, o: ALT+ Mpara alternar entre las terminaciones de línea de Mac y Unix / Linux, luego presione Enterpara guardar y CTRL+ Xpara salir.


hecho esto en un servidor Linux, el archivo tenía ^Mterminaciones. guardar como dos para mantener, guardar como linux para eliminar. puede verificar usandocat -v
HattrickNZ

Esta pregunta es sobre vim, no nano.
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMes el carácter \ro retorno de carro que agregan las terminaciones de línea de DOS. CtrlVle dice a vim que inserte un CtrlMcarácter literal en la línea de comando.

En su conjunto, este comando reemplaza todo \rcon nada, eliminándolos de los extremos de las líneas.



3

Puede usar el siguiente comando:
:%s/^V^M//g
donde '^' significa usar la CTRLtecla.


2

El siguiente comando se usa para reformatear todo el archivo .sh en el directorio actual, lo probé en mi sistema operativo Fedora.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

En vim, escriba:

:w !dos2unix %

Esto canalizará el contenido de su búfer actual al comando dos2unix y escribirá los resultados sobre el contenido actual. Vim le pedirá que vuelva a cargar el archivo después de


2

Para ejecutar directamente en la consola de Linux: vim file.txt +"set ff=unix" +wq


1

Por lo general hay un dos2unix comando que puede usar para esto, solo asegúrese de leer el manual ya que las versiones de GNU y BSD difieren en la forma en que manejan los argumentos.

Versión BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Versión GNU:

dos2unix $FILENAME

Alternativamente, puede crear la suya propia dos2unixcon cualquiera de las respuestas propuestas aquí, por ejemplo:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Sabía que había visto esto en alguna parte. Aquí está el consejo de inicio de sesión de FreeBSD:

¿Necesita eliminar todos esos caracteres ^ M de un archivo DOS? Tratar

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Aunque este tema es muy antiguo, me gustaría poner otras cosas de wikia:

%s/\r\+$//g

ese relleno encuentra todos los signos de retorno de carro (una y más repeticiones) hasta el final de la línea y borra, por lo que solo \npermanecerá en eol.


0

Esta es mi manera. Abrí un archivo en dos EOL y cuando guardo el archivo que se convertirá automáticamente a unix EOL

autocmd BufWrite * :set ff=unix

0

Si crea un archivo en NotePad o NotePad ++ en Windows y lo trae a Linux y lo abre por vim, verá ^ M al final de cada línea. Para eliminar esto,

En su terminal de Linux, escriba

dos2unix filename.ext

Esto hará la magia requerida.


0

Quería nuevas líneas en lugar de las ^ M's. Perl al rescate:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

O para escribir en stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
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.