Parece que tu desagradable expresión regular no era lo bastante desagradable ... :-)
Sección de búsqueda
La búsqueda tendría que cambiarse a esto:
^Hide\(\(\(Show\|Hide\)\@!\_.\)*\)SetFontSize 28
Esto incluye bastantes cosas poco comunes y tantos paréntesis ... Veamos qué tenemos allí:
El Caret ( ^
)
El símbolo de intercalación se usa para indicar el comienzo de la línea. Creo que ya estamos familiarizados con este.
Un punto importante, el ^
no funciona, excepto como el primer personaje en su patrón. Después se toma al pie de la letra. Para incluir un comienzo de línea dentro de su expresión, debe usar \_^
. Sin embargo, en nuestra situación no necesitábamos eso.
(Hay un fenómeno similar con $
y \_$
)
El primer y último paréntesis ( \( ... \)
)
El primer y último paréntesis se usan por sí mismos, lo que significa que tomará lo que aparezca dentro y lo establecerá en parámetro \1
. Ya lo usó en su propia expresión regular, por lo que supongo que también está familiarizado con este.
El segundo conjunto de paréntesis
Como puede observar, hay un segundo conjunto de paréntesis seguido de un asterisco \( ... \)*
. Esto significa que estamos buscando lo que coincida varias veces. Esta es la forma habitual de usar el asterisco, por lo que debe estar familiarizado con él.
El tercer conjunto de paréntesis, OR, y \_.
Sí, en realidad hay tres paréntesis antes de la palabra Show
. Este último conjunto es necesario por dos razones: la \|
y la siguiente @!
.
Con respecto a la operación OR, ya debería estar familiarizado con ella.
Show\|Hide or Hide\|Show
El orden no importa aquí. El \
es necesaria frente a la |
de trabajo en vim.
El paréntesis alrededor de esta expresión nos permite seguir la expresión por algo . Aquí el @!
.
\(Show\|Hide\)@!
Este es mucho menos familiar. Significa si no coincide . Sin embargo, el uso de esto no es muy fácil, pero debe seguir esa expresión con lo que desea extraer que no debe coincidir con dicha expresión. Es por eso que tenemos \_.
detrás de ese patrón.
Los \_.
medios coinciden con cualquier cosa. Al contrario de lo .
que ocurre por sí solo, que no coincide con el \n
personaje. En otras palabras, hacemos coincidir cualquier carácter en cualquier número de líneas a menos que coincida con Show
o Hide
.
Tenga en cuenta que el paréntesis alrededor de esa expresión también es importante, como lo es el asterisco, por lo que todo esto es realmente lo que lo hace funcionar:
\(\(Show\|Hide\)@!\_.\)*
aka coinciden con lo que sea hasta el siguiente Show
o Hide
caracteres (nota que también coincidiría Showing
, Shower
, HideMe
, etc Usted debe ser capaz de utilizar \<
y \>
si es necesario para que coincida con la palabra exacta.)
Nota al margen: para buscar en varias líneas, también es posible usar el \n
carácter en el patrón. Sin embargo, no es tan versátil como el \_.
patrón.
SetFontSize 28
Ahora la sección tiene que incluir SetFontSize 28
también. Tal como lo tenías en tu expresión regular. Si no SetFontSize 28
aparece en esa sección, intente la búsqueda nuevamente en la siguiente sección.
Debido a la negación anterior (la coincidencia excepto Show
o Hide
) la búsqueda no se filtra a la siguiente sección, con el riesgo de estropearla.
Sección de reemplazo
El reemplazo es el mismo que tenía:
.../Hide\1SetFontSize 18/
Usamos el paréntesis en la búsqueda para que \1
funcione como se esperaba.
Búsqueda completa y reemplazo
Los patrones resultantes son así:
:%s/^Hide\(\(\(Show\|Hide\)@!\_.\)*\)SetFontSize 28/Hide\1SetFontSize 18/
El \(Show\|Hide\)
debe incluir todos los encabezados posibles .
Fuentes
Regex para que coincida con cualquier personaje, incluida la nueva línea ( \_.\{-}
)
Busque líneas que no contengan patrones y otras búsquedas útiles ( @!
)
Documentación de Vim: patrón ( \_^
)
Hide
bloque tiene unaSetFontSize
línea (cualquiera que sea el valor)? Si es así, podría usar:%s/Hide\_.\{-\}SetFontSize \zs28/18/