2014-09-04 19 views
5

Haben solche Zeile:Vim Äquivalent des "tr" Befehl

xxAyayyBwedCdweDmdwCkDwedBAwe 
;;;; cleaner example 
__A__B__C__D__C_D_BA_ 

ersetzen wollen die ABCD in PQRT z.B. zu erhalten

__P__Q__R__T__R_T_QP_ 

beispiel des quivalent der nächsten bash oder perl tr

tr '[ABCD]' '[PQRT]' <<<"$string" 

Wie dies in "vim"? (VIM - vi improved 7,4 (2013 Aug 10, zusammengestellt 9. Mai 2014 12.12.40))

+6

ist das Betrug? '%! tr 'ABCD' 'PQRT'' – Kent

+0

@Kent heh ... Shell aufrufen? es funktioniert, hat aber gelegentliche Probleme mit dem Metazeichen, besonders wenn man 'tr' die' [] 'zu'() 'und so ... – kobame

+1

aufrufen'! tr' will, ist nur für einen kurzen cmd. Das 'tr()' ist besser, besonders wenn '(extern) tr' nicht verfügbar ist. mit '! tr','() oder [] 'wird jedoch kein Problem auftreten. es ist keine Regex. – Kent

Antwort

9

Sie die tr() Funktion mit :global kombiniert verwenden können

:g/./call setline(line('.'), tr(getline('.'), 'ABCD', 'PQRS')) 

Es ist leicht, es zu einer Anpassung :%Tr#ABCD#PQRS Befehl.

:command! -nargs=1 -range=1 Translate <line1>,<line2>call s:Translate(<f-args>) 

function! s:Translate(repl_arg) range abort 
    let sep = a:repl_arg[0] 
    let fields = split(a:repl_arg, sep) 
    " build the action to execute 
    let cmd = a:firstline . ',' . a:lastline . 'g'.sep.'.'.sep 
     \. 'call setline(".", tr(getline("."), '.string(fields[0]).','.string(fields[1]).'))' 
    " echom cmd 
    " and run it 
    exe cmd 
endfunction 
+0

Großartig! Für mich reicht die 1. Zeile. :) Vielen Dank. – kobame

+1

Schön. Sie brauchen nicht das ': g /./' BTW, da ': call' kann einen Bereich selbst nehmen :. –

+0

Oh. Ich wusste nichts davon. Vielen Dank. –