Vim Regex Capture Groups [bau -> byau: ceu -> cyeu]


132

Ho un elenco di parole:

bau
ceu
diu
fou
gau

Voglio trasformare quella lista in:

byau
cyeu
dyiu
fyou
gyau

Ho provato senza successo il comando:

:%s/(\w)(\w\w)/\1y\2/g

Dato che questo non funziona, cosa devo cambiare per far funzionare i gruppi di acquisizione regex in Vim?



4
È un po 'fuori tema, quindi l'ho inserito qui come commento, ma ... lo farei :%norm ay<CR>.
rom

2
Nel tuo caso (se è esattamente come descritto), è un'opzione per: passare alla seconda colonna con l, accedere alla modalità Visual Block con Ctrl+v, contrassegnare l'intera colonna con Shift+gseguito da l, quindi accedere alla modalità Inserisci con Shift+ie inserire 'y'. 7 sequenze di tasti inclusa la finitura Escper uscire dalla modalità Inserisci. Non pubblicare come risposta perché non si tratta in realtà di gruppi di acquisizione (che è quello che ho cercato quando l'ho trovato). :-)
LAFK dice Reinstate Monica il

Risposte:


224

Un modo per risolvere questo problema è assicurarsi che il motivo sia racchiuso tra parentesi sfuggite :

:%s/\(\w\)\(\w\w\)/\1y\2/g

Leggermente più corta (e più magia -al) è quello di utilizzare \v, il che significa che nel modello dopo che tutti i caratteri ASCII, tranne '0'-'9', 'a'-'z', 'A'-'Z'e '_'hanno un significato speciale:

:%s/\v(\w)(\w\w)/\1y\2/g

Vedere:


41

Se non vuoi sfuggire ai gruppi di cattura con barre rovesciate (questo è quello che ti sei perso), fai finta \vdi trasformare il motore delle espressioni regolari di Vim in una modalità molto magica :

:%s/\v(\w)(\w\w)/\1y\2/g

Ingo, scusami per aver posto una domanda nel posto sbagliato: Questo lavoro trova dentro :exmode; c'è un modo per farlo nella finestra di dialogo trova / sostituisci gvim?
JJoao,

3
@JJoao: No, la casella Trova / Sostituisci è solo per la ricerca e la sostituzione letterali. Non dovresti usarlo comunque; sono solo le ruote di addestramento per gli utenti di Blocco note.
Ingo Karkat,

Ingo, grazie (non è per me: sono contento di exmode, ma per i linguisti collaboratori in un progetto di dizionario): quasi funziona - con \v...regexp work find; nella stringa di sostituzione, &funziona ma \ sono protetti ( \1\rvengono persi)
JJoao

@JJoao: Sì, è quello che ho scoperto anche giocando con esso. Sono ancora scettico sul fatto che usare Vim senza la modalità Ex sia una buona idea, ma potresti facilmente creare la tua finestra di ricerca e sostituzione (alimentata internamente :s) tramite inputdialog()e un po 'di Vimscript.
Ingo Karkat,

Ingo: grazie ancora; Sono d'accordo con la tua opinione scettica. Inputdialg +: s + vimscript è probabilmente il modo in cui gvim's find sostituisce è costruito. Per me il \1 \r trattamento è un bug gvim. Proverò a pubblicarlo in un elenco specifico di VIM. Nel frattempo proverò il mio unico vimscript-inputdialog.
JJoao,

34

Puoi anche usare questo modello che è più corto:

:%s/^./&y
  • %s applica il modello all'intero file.
  • ^. corrisponde al primo carattere della riga.
  • &yaggiunge yil modello successivo.

13

Devi anche sfuggire alla paratesi di raggruppamento:

:%s/\(\w\)\(\w\w\)/\1y\2/g

Questo è il trucco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.