Vim coincide con múltiples ^M precedidos por algo en la línea (ff=unix)

(^M aquí están ^V^M, ff=unix)

s/^M*$/\^M/ funciona bien, convierte 0-muchos ^M en uno ^M en cualquier línea.

Pero tratar de hacer esto solo en líneas coincidentes como "matchtext is here with more and more text^M^M^M" with s/^matchtext.*\zs^M*$/\^M/ y no funciona, sino que agrega uno ^M ?

es el comportamiento de .* aquí que no entiendo, s/\zs^M*$/\^M/ funciona pero solo introduciendo s/.*\zs^M*$/\^M/ no lo hace

problema de magia/nomagia? s/.\\*\zs^M*$/\^M/ parece funcionar, pero de nuevo s/matchtext.\\*\zs^M*$/^M/ no lo hace

preguntado el 27 de julio de 12 a las 16:07

Tu pregunta no me queda clara. ¿Qué estás tratando de lograr? Cuando tengo sometext.^M^M^M y yo hago :s/sometext.\zs^M*$/\^M/ luego reemplaza a los tres ^Ms con uno ^M. ¿No es eso lo que estás buscando? -

Eso resulta ser un caso especial, intente cambiar el texto a sometext and more and more text^M^M^M y s/sometext.*\zs^M*$/\^M/ y no funciona. -

1 Respuestas

Su .* está haciendo coincidir todo, incluido todo el final ^Ms que no deja nada para tu ^M* coincidir, y no coincide con nada porque es un * por lo que se permite la coincidencia de 0 instancias. La codicia de los primeros * domina la codicia del segundo *.

Para arreglarlo podrías hacer lo primero * no codicioso (:help non-greedy) pero creo que deberías usar el :g comando, así:

:g/^matchtext/s/^M*$/\^M/

Respondido 28 Jul 12, 00:07

Buen enfoque. Cambiando el . a [^^M] también funcionará: s/^matchtext[^^M]*\zs^M*$/\^M/, pero me gusta más tu solución. - johnsyweb

Edité mi respuesta para agregar la barra invertida que olvidé la primera vez. @Johnsyweb, el [^^M] enfoque tiene una ligera diferencia: se detendrá en un ^M en medio de una línea, que sería ignorada por los demás. - alan curry

Gracias por tu respuesta Alan, con tu ayuda encontré la forma no codiciosa adecuada s/^matchtext.\{-}\zs^M*$/\^M/ que funciona Johnsyweb, esa es una solución muy lógica, gracias por eso. - kilos76

Supongo que esto significa que no logré que te interesaras en el :g comando... muy mal. Es versátil (se puede encadenar a otros comandos además de s///), portátil (disponible en todas las versiones vi) y es básicamente el comando (heredado de ed) que le dio a "grep" su nombre: alan curry

Sí, es versátil y lo he estado usando desde hace días en un teletipo lento, pero en general trato de encontrar una coincidencia adecuada (¡si es posible!) porque tiene usos más amplios y es más fácil de combinar con otras coincidencias (en mi opinión). O tal vez es solo una cuestión de filosofía... ;) A veces sí importa que g se limite a líneas individuales, mientras que :s puede funcionar en EOL con _. (a veces importante con la coincidencia de lenguaje natural). - kilos76

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.