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,50
per 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 submatch
comando 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 \2
e 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 g
viene 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.
vim
eemacs
posso fare questo genere di cose, ma potrebbe richiedere la scrittura di uno script piuttosto che l'utilizzo di un singolo comando.