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?

Bert Hekman
fuente
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.

pjz
fuente
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
Ludvig A. Norin
fuente
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 :)


fuente
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
Sylvain Defresne
fuente
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.


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

mercutio
fuente
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)

Sparkida
fuente
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
Venkataramesh Kommoju
fuente
6

Los siguientes pasos pueden convertir el formato de archivo para DOS a UNIX:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Referencia: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

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

Dave Webb
fuente
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
Dannid
fuente
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.

Stefan Sjöberg
fuente
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.

Rob Wells
fuente
4

Puedes usar:

vim somefile.txt +"%s/\r/\r/g" +wq

o dos2unix utility.

Christy Wald
fuente
3

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

JayG
fuente
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
Maerlyn
fuente
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

Tallak Tveide
fuente
2

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

CBuzatu
fuente
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}";
}
dsm
fuente
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 <[email protected]>
Albaro Pereyra
fuente
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.

promedio de carga
fuente
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
Thomas PABST
fuente
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.

Santle Camilus
fuente
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
usuario3379574
fuente