Come attivare il REGEX esteso in VIM

Evadere i caratteri che dovrebbero avere un significato speciale nelle regex può essere molto fastidioso. Ma VIM ha un'interessante funzione chiamata very magic! Ecco come usarla.

Tempo di lettura stimato: 5 minuti

Introduzione

In generale, esistono modi meno folli di creare espressioni regolari rispetto a VIM. Per questo motivo potresti voler utilizzare altri strumenti per testare, convalidare e poi importare la tua regex nell’editor di testo.

Risparmia tempo con un buon tester

Un interessante tester di regex è regex101.com, che aiuta molto quando si compone un’espressione enorme. Ce ne sono altri molto belli, ma questo è il mio preferito.

Una volta trovata l’espressione perfetta, scopri in VIM che ora devi fare l’escape di caratteri che non dovrebbero essere letterali! E poi devi trasformarli in caratteri speciali per far funzionare il tutto…

( { } ) Ma c’è un’ottima soluzione, che consiste nel richiamare un’opzione interna chiamata very magic, che ti aiuterà molto a evitare l’escape di espressioni regolari molto lunghe.

Molto magico!

Quindi, per usare la magia, basta inserire un comando aggiuntivo prima dell’espressione regolare: \v

(Magia) \1 very magicIn un esempio semplice e poco creativo 😆 , sposiamo il gruppo 1 e poi lo riportiamo con , aggiungendo , ignorando tutto ciò che non è sposato in questa espressione.

#sem very magic
:%s/\v\(Magia\) furta-cor/\1 very magic/g

#com very magic
:%s/\v(Magia) furta-cor/\1 very magic/g

Finora tutto bene. Non sembra intralciare troppo il gioco. Ma facciamo un esempio più lungo, in cui il mancato utilizzo della magia può essere un vero problema.

Abbiamo 6 campi in un elenco di prodotti e dobbiamo fare alcune sostituzioni e inserimenti di righe e dati da inserire in un file .txt per generare NFe da Sefaz.

1|9388552610010|Item A|44.0000|10.0404545455|441.78
2|9488542618041|Item B|3.0000|14.0980000000|70.49
3|9588532619058|Item C|41.0000|4.9614285714|69.46
4|9583522613157|Item D|9.0000|4.5585714286|223.37
5|9588122623188|Item E|18.0000|4.8527777778|87.35
6|9384562634201|Item F|14.0000|28.2492857143|395.49
7|9285562614225|Item G|17.0000|10.7370588235|182.53
8|9186562647232|Item H|8.0000|3.2850000000|26.28
9|9280562617256|Item I|36.0000|125.0611111111|4502.20
10|9188552617270|Item J|14.0000|15.4914285714|216.88
11|9178552627324|Item K|17.0000|5.2288235294|88.89

L’elenco è stato inserito nel texter regex101.com, perfetto, tutti i campi corrispondevano.

Se lo inserisci direttamente in VIM, semplicemente non funzionerà. \v Ecco come dovrebbe apparire, senza usare molta magia:

#sem very magic, lotado de escapes

:%s~^\(\d+\)\|\(\d\{13\}\)\|\(.*\)\|\(\d+\.\d\{4\}\)\|\(\d+\.\d\{10\}\)\|\(\d+\.\d\{2\}\)$~H|\1||\rI|\2||\3|49019900||5102|un|\4\|\5|\6||un|\4|\5|||||1|||||||\rM||\rN|\rN10d|0|103|\rO||||999|\rO07|99|0.00|\rO11|0.0000|0.0000|\rQ|\rQ04|07|\rS|\rS04|07|~g

Ora, con \v

#com very magic, mais legível, (mais) compatível com outros robôs de regex, como o do regex101, do sed -E etc

:%s~\v^(\d+)\|(\d{13})\|(.*)\|(\d+\.\d{4})\|(\d+\.\d{10})\|(\d+\.\d{2})$~H|\1||\rI|\2||\3|49019900||5102|un|\4\|\5|\6||un|\4|\5|||||1|||||||\rM||\rN|\rN10d|0|103|\rO||||999|\rO07|99|0.00|\rO11|0.0000|0.0000|\rQ|\rQ04|07|\rS|\rS04|07|~g

$1 $2 $3Nota: i mirror di gruppo nei vari motori di regex sono di solito chiamati con $: , ma in VIM è \1 \2 \3

Per non incappare in problemi molto magici e godersi solo il bello, c’è una cosa importante da sapere: diversi caratteri che non hanno un significato speciale in altri robot regex, ora lo hanno qui, in VIM.

\v @ % & ~Utilizzando , si dà un significato speciale ad alcuni caratteri molto strani, come ad esempio . Quindi, se ti servono come letterali, evadili con \

@%&~

:%s/\v\@\%\&\~

Automatizzare la magia

Purtroppo non è possibile impostare l’opzione magica in .vimrc. \v Dovrai applicarla individualmente a tutte le regex che hai impostato. Puoi mappare la combinazione /s per generare un /s\v automaticamente aggiungendo l’opzione cnoremap nel tuo ~/.vimrc (Grazie al collega Micael Levi per la segnalazione nell’eccellente community di Telegram sulle espressioni regolari).

 " Mapeia s/ para /s\v
 cnoremap s/ s/\v


” Mappa /s in /s\v cnoremap s/ s/\v

Scopri tutte le informazioni su very magic e le altre opzioni di magia nella :guida di VIM

:help magic

(...) Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z', 'A'-'Z' and '_' have special meaning: "very magic"

Domande, suggerimenti? Facci sapere nei commenti!

Vedi anche

Comentários

Altri articoli

Come utilizzare bc, il calcolatore di conchiglie

bc = calcolatrice da banco.
Se non conosci ancora la calcolatrice della tua shell, è il momento di imparare a usarla, anche se il suo utilizzo è molto elementare.
L’uso più banale delle sue funzioni dovrebbe già soddisfare la maggior parte delle tue esigenze.
Ma non lasciarti ingannare: si tratta di un software davvero potente che dovrebbe essere assolutamente presente nel tuo radar.

Leggi l'articolo "

Codifica/decodifica degli URL con sed

Esistono vari modi per codificare/decodificare gli url.
In genere i programmatori utilizzano funzioni già pronte per questo scopo.
Ma sai davvero cosa fanno queste funzioni?
Per questo articolo, ho scelto sed come strumento per sostituire i codici e ti indicherò le RFC che trattano l’argomento.

Leggi l'articolo "

Capire come personalizzare VIM su MacOS

Se stai già iniziando a familiarizzare con VIM, è il momento di fare i passi successivi.
In questo articolo ti spiegherò come configurare VIM per MacOS in quello che considero il modo più pulito (potresti volerlo installare in modo diverso e non c’è problema) e come configurare i plugin NerdTree, per accedere all’albero delle directory; Status Tab per inserire alcuni strumenti aggiuntivi sullo schermo (che rendono VIM molto bello); e il plugin Git, per facilitare il controllo delle versioni senza lasciare l’applicazione.
Buona lettura!

Leggi l'articolo "
bureau-it.com