Dopo aver frugato un po 'di più, risulta che Vim può farlo con un solo comando, senza script. Ad esempio, per aggiungere 50 a tutti i numeri seguenti <obj param="è possibile utilizzare:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Lasciami scomporre.
: è il modo generale per accedere / indicare la modalità riga di comando in vim.
%significa nell'ambito di tutto il documento; potresti inserire un intervallo di numeri, ad esempio, 1,50per farlo entro le prime 50 righe.
s è una scorciatoia per il sostituto (puoi scrivere l'intera parola se preferisci)
@è il delimitatore; potresti usare qualsiasi altro personaggio purché non sia in quello che stai cercando. Usalo tre volte. (La sintassi è simile a sed.)
Tutto fino alla successiva occorrenza del delimitatore @ è il modello reg ex da cercare, in questo caso <obj param="seguito da \d\+, che è un numero qualsiasi di cifre. Il \(e \)sono lì per impostare questa intera sequenza di cifre come un singolo gruppo di reg ex che corrisponderebbe a riferimenti indietro come \1, o submatchcomando di vim .
Quindi il delimitatore @contrassegna quello che segue come testo sostitutivo.
La \=corrispondenza dei mezzi iniziano qui di sostituire il risultato di qualche espressione valutata, piuttosto che una reg ex modello o stringa, che è la chiave qui.
Quindi abbiamo '<obj param="'per l'inizio del testo di sostituzione. Il .che segue è la funzione di vim per concatenare le stringhe.
submatch(1)è una funzione integrata di vim che può essere utilizzata solo all'interno di un comando di sostituzione e restituisce la stringa che è la stessa di regex \1; useresti submatch(2)per l'equivalente di regex \2e così via. ( \0è l'intero modello abbinato, ma non lo vogliamo qui.) Il \(e e \)nel modello di ricerca vengono utilizzati per contrassegnare ciò che conta come submatch(1).
Da qui (submatch(1) + 50)deriva il risultato dell'aggiunta di 50 al numero seguito dalle cifre <obj param="nel modulo del modello di ricerca.
Il delimitatore @viene nuovamente utilizzato per contrassegnare la fine del testo sostitutivo.
La bandiera gviene utilizzata per rendere globali le sostituzioni; potresti ometterlo se volessi sostituire la prima istanza su ogni riga.
Probabilmente puoi capire da lì come aggiungere numeri diversi, sottrarre o dividere, ecc.
vimeemacsposso fare questo genere di cose, ma potrebbe richiedere la scrittura di uno script piuttosto che l'utilizzo di un singolo comando.