Vim - como substituir uma nova linha \ n por duas \ n

34

No editor do vim, desejo substituir um caractere de nova linha (\ n) por dois novos caracteres de linha (\ n \ n) usando o modo de comando vim.

Conteúdo do arquivo de entrada:

This is my first line.
This is second line.

Comando que eu tentei:

:%s/\n/\n\n/g

ele substitui a string por caracteres indesejados como

This is my first line.^@^@This is second line.^@^@

Então eu tentei o seguinte comando

:%s/\n/\r\r/g

Está funcionando corretamente. Você pode explicar por que está funcionando bem com o segundo comando?

Raghvendra
fonte
Veja também unix.stackexchange.com/a/206404
Stéphane Chazelas
2
FYI: Há também um Vi e Vim (beta) SE .
Dubu
2
Nota lateral, você não precisa usar /como separador. Isto é mais legível::%s;\n;\n\n;g
DJMcMayhem
11
Procurar \n, substituir com \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Respostas:

47

Curiosamente, \nno vim para substituição não significa nova linha, mas nulo. ASCII nul é ^@( control@).

Historicamente, vi substitui ^M( controlM) como o final da linha, que é a nova linha. O vim adicionou uma extensão \r(como a linguagem C) para ter o mesmo significado ^M, mas os desenvolvedores optaram por tornar a \nmédia nula ao substituir o texto. Isso é inconsistente com o uso nas pesquisas , que encontram uma nova linha.

Leitura adicional:

Thomas Dickey
fonte
7

Tente o seguinte: %s/$/^V^M/(onde ^Vestá Ctrl-Ve ^Mestá Ctrl-M- quando você digita, ^Vele imprime um ^caractere e depois retrocede sobre ele e, quando você digita ^M, aparece como ^M... o Ctrl-V é o próximo caractere literal tty padrão - execute o comando stty -apara mostrar os caracteres especiais do seu tty).

Murray Jensen
fonte
De fato, os mais experientes saberão disso para a conversão sempre necessária do CRLF como uma alternativa ao abandono e ao uso do dos2unix ou similar. O uso do Ctrl-V é uma lição do dia 1.
Mckenzm
5

vimuse \npara representar um caractere nulo \0na memória, que como o vimarquivo de manipulação contém caracteres nulos (embora vinão possa).

O uso de \napenas o final da linha correspondente no buffer, não a nova linha na string ao usar na expressão.

Consulte : h NL usado para Nulo e : h CR usado para NL para obter mais detalhes.

cuonglm
fonte
1

Testado com Neovim ( nvim) e Vimversões

NVIM v0.3.0
VIM - Vi IMproved 8.1

Remova uma nova linha:

cell
allele
rs2981578
fgfr2

Aqui, \ncorresponde às novas linhas (para inserir uma nova linha, no entanto, use \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Adicione uma nova linha:

Não:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@é uma marca diacrítica para LF (avanço de linha; consulte http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )

Sim:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Para responder à pergunta do OP (como substituir um \npor dois \n\n), basta adicionar outro \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... ou seja, corresponda à nova linha original ( \n) e substitua-a por duas novas linhas / retornos de carro ( \r\r).

Victoria Stuart
fonte