Linha de comando no modo vi: substitua todos

1

Como faço para substituir globalmente da linha de comando no modo vi. Parece que não posso usar ex-comandos prefixando com : , então o que eu faço em vez disso.

por exemplo, se eu quiser substituir todo o \ por / em um comando ...

    
por David West 21.03.2016 / 20:25

4 respostas

3

Eu usaria o mecanismo de histórico de bash :

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/b/B/
echo 'foo\Bar\Baz'
foo\Bar\Baz

No entanto, parece que não consigo substituir barras invertidas

$ echo 'foo\bar\baz'
foo\bar\baz
$ !!:gs/\/\//
bash: :gs/\/\//: substitution failed
    
por 21.03.2016 / 20:55
1

no modo de comando vi

:1,$s+\+/+g

isso substitui todos os caracteres de barra invertida por barras "

    
por 21.03.2016 / 20:44
1

vi fornece mais de uma maneira de fazer isso. Para abordar todas as linhas em ex (as linhas ":"), você pode usar % ou 1,$ . Da mesma forma, ele permite diferentes delimitadores para o s (comando substituto). Então você pode ter essas variações:

:%s/\/\//g
:%s,\,/,g
:1,$s/\/\//g
:1,$s,\,/,g

o ponto é que

  • a barra invertida é um caractere meta para as expressões regulares usadas na substituição e precisa ser evitada para usá-la,
  • o delimitador tem que ser um caractere de pontuação e
  • finalmente, (no primeiro e terceiro exemplos), é possível usar o delimitador como parte das strings before / after, mas nesse caso ele também precisa ser escapado.
por 21.03.2016 / 21:22
1

Se você está tendo problemas para substituir \ por / globally dentro do vi, é porque o primeiro caractere é especial e precisa ser escapado, e o segundo é geralmente escolhido como separador de sed e também precisa ser escapado. Você pode usar:

:%!tr '\' '/'

ou

:%s,\,/,g

ou

:%s/\/\//g

Para completar, é isso que você teria que fazer se estivesse usando vi simples (sem macros) e não quiser usar o modo ex:

/\
r/nr/nr/nr/nr/nr/nr/nr/nr/nr/nr/n

repita que duram quantas vezes forem necessárias, eu só o incluo para mostrar o que você deve fazer se você não quiser usar o modo ex.

    
por 21.03.2016 / 20:34

Tags