Se i caratteri alfabetici sono disposte in sequenza in bersaglio codifica , utilizzare il seguente comando cambio .
:%s/./\=nr2char(char2nr(submatch(0))+2)/g
Tuttavia, questa sostituzione implementa la lettera spostamento non circolare. Uno spostamento circolare può essere implementato con due sostituzioni che gestiscono separatamente le lettere maiuscole e maiuscole.
:%s/\l/\=nr2char(char2nr('a') + (char2nr(submatch(0)) - char2nr('a') + 2) % 26)/g
:%s/\u/\=nr2char(char2nr('A') + (char2nr(submatch(0)) - char2nr('A') + 2) % 26)/g
Un altro modo è quello di tradurre i caratteri usando la funzione tr()
. Supponiamo che la variabile contenga caratteri minuscoli di un alfabeto disposti nell'ordine corretto e che la variabile contenga la stringa di caratteri corrispondente a quelli in a
(di seguito è riportato un esempio di lettere inglesi).
:let a = 'abcdefghijklmnopqrstuvwxyz'
:let a1 = a[2:] . a[:1]
per evitare di digitare l'intero alfabeto a mano, il valore di a
possono essere prodotti come segue,
:let a = join(map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)'), '')
Poi, da sostituire ogni lettera in una linea da una lettera due posizioni lungo la alfabeto, utilizzare la sostituzione
:%s/.*/\=tr(submatch(0), a . toupper(a), a1 . toupper(a1))
È vero per ASCII e alcuni alfabeti in UTF-8, ad es. Inglese.
Prima di eseguire il comando, assicurarsi che l'opzione encoding
è impostato di conseguenza.
Grazie .. Ma se voglio avere la sostituzione circolare ..come y-> a z-> b è possibile in una sola riga? – hari
@hari: vedere la modifica della risposta. –
solo una piccola osservazione: il '.' che concatena la stringa rende difficile la lettura quando si esegue il codice in C++, preferirei riempirlo con spazi su entrambi i lati (sembra che non l'hai golfato questa volta, dati gli spazi dopo le virgole !) – Benoit