regular-expression – ¿Cómo puedo ejecutar: sustituir solo una parte de la línea y no toda?

Pregunta:

Tengo una línea como esta:

function my_function(argument, another argument, but there are spaces)

Quiero sustituir los caracteres de espacio (dentro de los nombres de los argumentos) con un guión bajo. Por tanto, me gustaría utilizar:

:s/\ /_/g

pero, ¿cómo puedo elegir no aplicarlo a toda la línea, sino a partir de, digamos, la posición del cursor? (¿O la tercera palabra)?

Respuesta:

Puede utilizar la siguiente solución:

Primero use v $ para seleccionar el texto desde el cursor hasta el final de la línea. Luego usa el siguiente comando:

:s/\%V\ /_/g

El \%V indica cambiar el texto en el área previamente seleccionada visualmente, ver :h /\%V

Si tomo tu ejemplo:

function my_function(argument, another argument, but there are spaces)

Si mi cursor está en la columna 40 y uso el comando que acabo de escribir, obtengo:

function my_function(argument, another argument,_but_there_are_spaces)

En respuesta a su comentario también puede utilizar

  • \%# que coincide con la posición del cursor
  • \%>23c que coincide con la columna 23.
  • \%>'m que coincide con la posición de una marca

Ver :h /\%# :h /\%>c :h /\%>'m .

@ User9433424 dio una forma de usar \%# en su comentario. Para el patrón con la marca, puede configurarlo con ma y luego usar:

:s/\%>'a /_/g

Una explicación del patrón dado por @ User9433424 es la siguiente:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

Querrá ver :h \v y :h /\@<=

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım