Sembra che la tua brutta espressione regolare non era abbastanza brutto ... :-)
Cerca nella sezione
La ricerca dovrebbe essere modificata in questo:
^Hide\(\(\(Show\|Hide\)\@!\_.\)*\)SetFontSize 28
Questo include alcune cose insolite e così tante parentesi ... Vediamo cosa abbiamo dentro:
The Caret ( ^
)
Il cursore viene utilizzato per indicare l'inizio della riga. Penso che abbiamo già familiarità con questo.
Un punto importante, il ^
non funziona se non come il primo personaggio nel tuo schema. Dopo di che è preso alla lettera. Per includere un inizio di riga nella tua espressione devi usare \_^
. Tuttavia, nella nostra situazione non ne avevamo bisogno.
(C'è un fenomeno simile con $
e \_$
)
La prima e l'ultima parentesi ( \( ... \)
)
La prima e l'ultima parentesi vengono utilizzate da sole, il che significa che afferrerà tutto ciò che appare all'interno e lo imposterà nel parametro \1
. L'hai già usato nel tuo regex, quindi suppongo che anche tu abbia familiarità con questo.
La seconda serie di parentesi
Come puoi notare, c'è una seconda serie di parentesi seguita da un asterisco \( ... \)*
. Ciò significa che stiamo cercando ciò che corrisponde un numero qualsiasi di volte. Questo è il solito modo di usare l'asterisco, quindi dovresti conoscerlo.
La terza serie di parentesi, OR e \_.
Sì, ci sono in realtà tre parentesi prima della parola Show
. Quest'ultimo set è necessario per due motivi: il \|
e il seguente @!
.
Per quanto riguarda l'operazione OR, dovresti già conoscerla.
Show\|Hide or Hide\|Show
L'ordine non ha importanza qui. Il \
è necessaria di fronte al |
al lavoro in vim.
La parentesi attorno a questa espressione ci consente di seguire l'espressione con qualcosa . Qui il @!
.
\(Show\|Hide\)@!
Questo è molto meno familiare. Significa se non abbinato . L'uso di questo non è molto semplice, tuttavia, ma è necessario seguire quell'espressione con ciò che si desidera estrarre che non deve corrispondere a tale espressione. Questo è il motivo per cui abbiamo \_.
dietro quel modello.
I \_.
mezzi corrispondono a qualsiasi cosa. Contrariamente al .
solo, che non corrisponde al \n
personaggio. In altre parole, abbiniamo qualsiasi carattere su qualsiasi numero di linee a meno che non corrisponda Show
o Hide
.
Nota che anche la parentesi attorno a quell'espressione è importante come l'asterisco, quindi tutta questa cosa è davvero ciò che la fa funzionare:
\(\(Show\|Hide\)@!\_.\)*
aka importo da fino a quello successivo Show
o Hide
caratteri (nota che sarebbe anche corrispondere Showing
, Shower
, HideMe
, ecc Si dovrebbe essere in grado di utilizzare \<
e \>
, se è necessario abbinare la parola esattamente.)
Nota a margine: per cercare su più righe, è anche possibile utilizzare il \n
carattere nel modello. Tuttavia, non è versatile come il \_.
modello.
SetFontSize 28
Ora anche la sezione deve includere SetFontSize 28
. Proprio come avevi nella tua regex. Se non SetFontSize 28
appare in quella sezione, riprovare a cercare nella sezione successiva.
A causa della negazione sopra (la corrispondenza tranne Show
o Hide
) la ricerca non passa alla sezione successiva, correndo il rischio di rovinarla.
Sezione di sostituzione
Il sostituto è lo stesso di quello che avevi:
.../Hide\1SetFontSize 18/
Usiamo la parentesi nella ricerca in modo che \1
funzioni come previsto.
Ricerca completa e sostituzione
I modelli risultanti sono i seguenti:
:%s/^Hide\(\(\(Show\|Hide\)@!\_.\)*\)SetFontSize 28/Hide\1SetFontSize 18/
L' \(Show\|Hide\)
dovrebbe includere tutti i possibili intestazioni .
fonti
Regex per abbinare qualsiasi personaggio incluso newline ( \_.\{-}
)
Cerca linee che non contengono pattern e altre ricerche utili ( @!
)
Documentazione Vim: pattern ( \_^
)
Hide
blocco ha unaSetFontSize
linea (qualunque sia il valore)? In tal caso, potresti usare:%s/Hide\_.\{-\}SetFontSize \zs28/18/