2012-03-07 15 views
5

Siempre quise saber cómo se puede sustituir dentro de parámetros determinados.Vim Sustitución

Si usted tiene una línea como esta:

123,Hello,World,(I am, here), unknown 

y wnat para reemplazar World con Foobar entonces esta es una tarea fácil: :%s/World/Foobar/

Ahora me pregunto cómo puedo deshacerme de un , que es wihtin el ().

Teóricamente solo tengo que encontrar la primera aparición de ( luego sustituir , con un espacio en blanco hasta ).

+2

Lea la entrada de Preguntas frecuentes sobre [formatear bloque de códigos en sus preguntas y respuestas] (http://meta.stackexchange.com/a/22189/151830)). – Benoit

Respuesta

4

búsqueda hacia delante Trate de búsqueda hacia atrás afirmaciones:

%s/([^)]*\zs,\ze.*)// 

(\zs y \ze saber dónde patrón comienza y fin)

o

%s/\(([^)]*\)\@<=,\(.*)\)\@=// 

El primero de ellos es más fácil de leer, el segundo utiliza \(... \) agrupaciones con paréntesis dentro de los grupos que lo hace parecer ofuscado, y \@<= que apar t de ser un buen pato ASCII-art es el operador lookbehind, y \@= que es el operador de lookahead.

Referencias: :help pattern (más detalle :help /\@=, :help /\ze, etc.)

usa el entorno gráfico y quieren probar los comandos? Cópialos en el portapapeles y ejecuta :@+ dentro de Gvim.

0

Para su ejemplo, esto es lo mismo que lo sugerido por @ubuntuguy

%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3 

Esto hará el reemplazo exacto que desea.

+0

Desafortunadamente, esto eliminará el último ',', no el que está dentro '(' ')'. – mouviciel

1

También puede seleccionar el texto que desea cambiar (con los modos visual o visual-block) e ingrese el : para iniciar el comando de reemplazo. vi iniciará automáticamente el comando con :'<,'> que aplica el comando al área seleccionada.

Sustitución de un , se puede hacer con:

:'<,'>s/,/ /g 
2

modificando ligeramente la respuesta de @ Tom le puede dar un buen tranquila y "un poco" número más legible:

%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/ 

De esa manera usted tendrá: en \1 se almacenará lo que está a la izquierda fuera del paréntesis, \4 lo que está a la derecha fuera del paréntesis y \2 y \3 lo que está dentro del paréntesis, respectiva ly a la izquierda (\2) y a la derecha (\3).

Con eso puede intercambiar fácilmente sus elementos si su archivo está organizado como columna.

+0

(por cierto, la respuesta de Benoit es mucho más elegante) –

0

Sin embargo, otro enfoque, basado en el hecho de que realmente desea sustituir sólo la primera aparición de , dentro del paréntesis:

:%s#\((.\{-}\),#\1 # 

Explicación:

  • :%s para la sustitución de todo el archivo (no use % si quiere trabajar solo con la línea actual)
  • podemos usar # o : como un delimitador para hacer que el comando sea más legible
  • en (.\{-} solicitamos encontrar cualquier símbolo (punto) después del paréntesis izquierdo y el resto significa 0 o más ocurrencias (el menor número posible) de este símbolo. Esta expresión se coloca dentro de \(...\) para poder referirse a este grupo como \1 en el futuro.