Reemplazar un carácter ^M en Vi
Resuelto
guin
-
leon91490 Mensajes publicados 200 Fecha de registro Estado Miembro Última intervención -
leon91490 Mensajes publicados 200 Fecha de registro Estado Miembro Última intervención -
J'ai plein de caractères ^M dans mon fichier Vi sous Linux
avez-vous un moyen pour s'en débarrasser
J'ai essayé :1,$ s/\^M//g ça ne marche pas !!
Merci pour votre aide
avez-vous un moyen pour s'en débarrasser
J'ai essayé :1,$ s/\^M//g ça ne marche pas !!
Merci pour votre aide
9 respuestas
-
Estoy respondiendo a este viejo post porque está bien posicionado en Google y las respuestas son bastante superficiales...
En fin, solo hay que escribir en vim:
:set fileformat=unix
y el archivo se convierte con los finales de línea de unix.
Inversamente:
:set fileformat=dos
permitirá a los usuarios de Windows leer su archivo de forma agradable. Este comando fija el formato del archivo, por lo que no es necesario volver a hacerlo en cada apertura.
El comando unix
file mon_fichier.txt
permite conocer el tipo de mon_fichier.txt (o de cualquier archivo con un contenido mime válido)
Y efectivamente, con el paquete tofrodos instalado, tienes los comandos:
fromdos mon_fichier.txt
todos mon_fichier.txt
cuyo nombre es bastante explicativo.
En la misma categoría en vim:
:set fileencoding=utf-8
convierte el archivo iso-machin o latinX a utf8
Inversamente:
:set fileencoding=iso-8859-15
convierte el archivo para ser legible en win98 o para su sitio web obsoleto ]:->
En línea de comandos, "iconv" hará maravillas. Para más precisión:
man iconv -
Hola guin,
Para complementar la respuesta, en "vi", puedes escribir caracteres no imprimibles como "^M" (que significa "Ctrl-M", esta combinación da el código ASCII equivalente a la tecla "enter") pulsando "Ctrl-v" seguido de la tecla no imprimible.
Así que al pulsar Ctrl-v y luego Ctrl-M, obtienes un "^M" que vi interpreta como el carácter no imprimible Ctrl-M.
Dal -
Aquí está la respuesta :
escriba el siguiente comando :
:1$ s/\r//g
Gracias por su disponibilidad -
Hola,
Por razones inexplicables, dos2unix (o fromdos) es ineficaz en este archivo lleno de ^M y que solo tiene una enorme línea.
Para reemplazar los ^M por un verdadero retorno de línea, se puede hacer:
:% s/^M/\r/g (el ^M se obtiene como se dijo arriba: Ctrl V + Ctrl M)
pero
:% s/\r/\r/g funciona igual de bien!!! (vim 7 en Linux Debian etch)
(las razones podrían ser que habría que haber usado un mac2unix?)-
Hola,
( las razones pueden ser que habría que hacer un mac2unix ? )
No lo creo ;-)
lami20j@debian:~$ cat -v CR linea1^M linea2^M lami20j@debian:~$ perl -pi -e 's/\r//' CR lami20j@debian:~$ cat -v CR linea1 linea2 lami20j@debian:~$ perl -pi -e 's/\n/\r\n/' CR lami20j@debian:~$ cat -v CR linea1^M linea2^M lami20j@debian:~$ sed -i 's/\r//' CR lami20j@debian:~$ cat -v CR linea1 linea2
- Hola
Muy interesante, pero mi archivo se presentaba con una sola línea muy larga, llena de ^M
( se trata del archivo sommaire.html del esqueleto SPIP: IENSP-XvPP que se encuentra aquí: http://www.stephane-kus.fr/IMG/zip/IENSP-XvPP-3-1.zip )
gracias - Gracias lami20, pero con esta solución, aunque eliminamos los numerosos ^M, no los reemplazamos por retornos de línea como quisiéramos. Simplemente se eliminan.
perl -pi.orig -e 's/^M/\r/g' sommaire.html
perl -pi.orig -e 's/\r/\r/g' sommaire.html
no tienen ningún efecto (a diferencia de la sustitución en vim que me prestó este servicio fielmente).
-
-
Hola,
El comando unix
file mon_fichier.txt
permite conocer el tipo de mon_fichier.txt
Como complemento, el comando cat permite ver los caracteres no imprimiblescat -A fichier.txt
--
106485010510997108 -
Hola,
¿El archivo en cuestión estaba almacenado en Windows anteriormente?
Tuve un problema un poco similar (saltos de línea con un \M o L, no recuerdo bien la letra), un script que había almacenado en Windows y leído con vi en Linux.
Utilicé el programa 'dos2unix'
Después el script estaba como nuevo :)
Luc L.
[Gentoo] por fin :Þ -
voui, suscribo, aunque en mi caso la máquina se llama fromdos
fromdos < tuarchivoasqueroso > tuarchivolimpio
pero solo un comentario respecto a tu reemplazo en vi: los caracteres de control, no los escribes con un acento circunflejo (ni siquiera escapado) seguido del carácter. para tener tu "acento circunflejo-M" escribes Ctrl-V Ctrl-M
todos los caracteres de control se escriben así, Ctrl-V seguido de tu carácter de control
lo que da (pero no estoy seguro de que aparezca... ah, bueno no aparece)
un tien en los campos
lo tendrás malvado -
Hola,
no los sustituimos por saltos de línea como nos gustaría
Es normal ya que eso es lo que he ejecutado y parece que he entendido mal que eso es lo que quieres en realidad ;-)
De lo contrariolami20j@debian:~$ cat -v fic_ linea1^Mlinea2^Mlinea3^Mlinea4^M lami20j@debian:~$ perl -pi.orig -e 's/\r/\n/g' fic_ lami20j@debian:~$ cat -v fic_ linea1 linea2 linea3 linea4 lami20j@debian:~$ cat -v fic_.orig linea1^Mlinea2^Mlinea3^Mlinea4^M
Y si quieres mantener el formato doslami20j@debian:~$ cat -v fic_ linea1^Mlinea2^Mlinea3^Mlinea4^M lami20j@debian:~$ perl -pi.orig -e 's/\r/\r\n/g' fic_ lami20j@debian:~$ cat -v fic_ linea1^M linea2^M linea3^M linea4^M lami20j@debian:~$ cat -v fic_.orig linea1^Mlinea2^Mlinea3^Mlinea4^M
-
Me parece simple de describir:
Mi archivo tiene una única línea, llena de ^M
Quiero que cada ^M mostrado se convierta en una verdadera nueva línea
Entre todos estos métodos, solo el que he indicado ha podido funcionar en este archivo.
Estoy en Debian Etch, Gnome, y sea cual sea el modo de codificación del Terminal GNOME (v 2.14.2), ninguno (iso-1, iso-15 o UTF-8) resuelve este problema (habitualmente bajo UTF-8 y en francés)
¿Has ido a ver/probar el archivo en cuestión?
Su descripción por file es la siguiente:
file sommaire.html: documento de texto HTML de ASCII extendido no ISO, con terminadores de línea CR
Creo que el "no-iso" debe referirse a eso..- Hola,
¿fuiste a ver/probar el archivo en cuestión?
Claro que sí ;-(
Probé el comando de reemplazo que escribí en tus archivos (lo que me diste en el mensaje 10) y funciona.
No sé por qué no lograste hacerlo.
Para complacer te, acabo de probar una vez más.
Esto es lo que tengo$ file sommaire.html sommaire.html: Documento HTML de texto Non-ISO extended-ASCII, con terminadores de línea CR $ perl -pi.orig -e 's/\r/\n/g' sommaire.html $ file sommaire.html sommaire.html: Documento HTML de texto Non-ISO extended-ASCII $ file sommaire.html.orig sommaire.html.orig: Documento HTML de texto Non-ISO extended-ASCII, con terminadores de línea CR $ mv sommaire.html.orig sommaire.html $ file sommaire.html sommaire.html: Documento HTML de texto Non-ISO extended-ASCII, con terminadores de línea CR $ perl -pi.orig -e 's/\r/\r\n/g' sommaire.html $ file sommaire.html sommaire.html: Documento HTML de texto Non-ISO extended-ASCII, con terminadores de línea CRLF $ file sommaire.html.orig sommaire.html.orig: Documento HTML de texto Non-ISO extended-ASCII, con terminadores de línea CR $
-
-
-
y también para evitar problemas en el intercambio de archivos a través de un montaje de Windows o hacia Windows se puede hacer
mount //hostWindows/montage /media/reseau/ -o user,uid=yo,gid=yo,conv=auto,iocharset=utf8
muy práctico cuando se envían o reciben archivos de configuración hacia Windows.