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

30

No editor vim, quero 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 tentei:

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

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 me explicar por que está funcionando bem com o segundo comando?

    
por Raghvendra 04.12.2015 / 11:21

4 respostas

43

Curiosamente, \n no vim para substituição não significa nova linha, mas nula. ASCII nul é ^@ ( controle @ ).

Historicamente, vi substitui ^M ( controle M ) pela terminação de linha, que é a nova linha. O vim adicionou uma extensão \r (como a linguagem C) para significar o mesmo que ^M , mas os desenvolvedores escolheram fazer \n mean null quando substituindo texto. Isso é inconsistente com seu uso em pesquisas , que localizam uma nova linha.

Leitura adicional:

por 04.12.2015 / 11:29
7

Tente isto: %s/$/^V^M/ (onde ^V é Ctrl-V e ^M é Ctrl-M - quando você digita ^V , imprime um caracter ^ , em seguida, retorna o espaço sobre ele e, em seguida, quando você digita o ^M aparecerá como ^M ... o Ctrl-V é o caractere tty literal próximo - execute o comando stty -a para mostrar os caracteres especiais do seu tty).

    
por 04.12.2015 / 13:10
5

vim use \n para representar um caractere nulo vim na memória, que vi handle contém caracteres nulos (enquanto \n não pode).

O uso de %code% corresponde apenas ao final da linha no buffer, não à nova linha na sequência ao usar na expressão.

Veja : h NL-used-for-Null e : h CR-used-for-NL para mais detalhes.

    
por 04.12.2015 / 11:58
1

Testado com Neovim ( nvim ) e Vim versions

NVIM v0.3.0
VIM - Vi IMproved 8.1

Remover uma nova linha:

cell
allele
rs2981578
fgfr2

Aqui, \n corresponde a 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 (alimentação de linha; link )

Sim:

cell|allele|rs2981578|fgfr2

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

cell
allele
rs2981578
fgfr2

Para resolver a questão do OP (como substituir um \n por dois, \n\n ), basta adicionar outro \r :

cell
allele
rs2981578
fgfr2

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

cell

allele

rs2981578

fgfr2

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

    
por 14.06.2018 / 20:31