Reemplazar un carácter ^M en Vi

Resuelto
guin -  
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

9 respuestas

  1. jdautz
     
    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
    36
    1. jj
       
      super no útil cuando vim no está instalado
      0
  2. [Dal] Mensajes publicados 6122 Fecha de registro   Estado Colaborador Última intervención   1 108
     
    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
    13
  3. guin
     
    Aquí está la respuesta :

    escriba el siguiente comando :

    :1$ s/\r//g

    Gracias por su disponibilidad
    8
    1. OdEa
       
      sin olvidar el ";"

      :1;$ s/\r//g

      ;-)
      0
    2. Karim
       
      más bien el carácter ",", lo que da:
      :1,$ s/\r//g
      0
  4. Joseph Tux
     
    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?)
    2
    1. lami20j
       
      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
      0
      1. Joseph Tux > lami20j
         
        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
        0
      2. lami20j > Joseph Tux
         
        Hola,

        pero mi archivo se presentaba con 1 sola línea muy larga, llena de ^M

        Bueno, había que decirlo (.orig es para guardar el original)
        perl -pi.orig -e 's/\r//g' archivo
        0
      3. Joseph Tux > lami20j
         
        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).
        0
  5. lami20j Mensajes publicados 21506 Fecha de registro   Estado Moderador, Colaborador de seguridad Última intervención   3 571
     
    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 imprimibles
    cat -A fichier.txt
    --
    106485010510997108
    1
  6. kelux Mensajes publicados 3065 Fecha de registro   Estado Colaborador Última intervención   434
     
    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 :Þ
    0
  7. Usuario anónimo
     
    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
    0
  8. lami20j
     
    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 contrario
    lami20j@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 dos
    lami20j@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 
    0
    1. Joseph Tux
       
      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..
      0
      1. lami20j > Joseph Tux
         
        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 $ 
        0
      2. Joseph Tux > lami20j
         
        De nada
        0
    2. Richy
       
      %!tr '\015' '\;'
      0
  9. leon91490 Mensajes publicados 200 Fecha de registro   Estado Miembro Última intervención   47
     
    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.
    0