Pergunta
A partir de uma pergunta Como substituir um personagem para uma nova linha no Vim?.Você tem que usar quando a substituição de texto para uma nova linha, como este
:%s/%/\r/g
Mas, quando a substituição de final de linhas e quebras de linha para um personagem, você pode fazê-lo como:
:%s/\n/%/g
O que a seção do manual, documentos estes comportamentos, e qual é a lógica por trás delas?
Solução
A partir de vim docs em padrões:
\r
jogos <CR>
\n
jogos fim-de-linha - Quando a correspondência em uma seqüência de caracteres em vez de buffer de texto literal newline o caráter é correspondido.
Outras dicas
A partir de http://vim.wikia.com/wiki/Search_and_replace :
Quando A Pesquisa
...
\n
é newline,\r
éCR
(cr =Ctrl-M
=^M
)Quando Da Substituição Da
...
\r
é newline,\n
é um byte nulo (0x00
).
Outro aspecto é que \0
, que tradicionalmente é NULO, é levado em
s//\0/
para significar "toda a correspondência por padrão".(Que, por sinal, é redundante, e mais do que, &
).
- Portanto, você não pode usar
\0
para dizerNULL
, para que você use\n
- Portanto, você não pode usar
\n
para dizer\n
, para que você use\r
. - Portanto, você não pode usar
\r
para dizer\r
, mas eu não sei quem gostaria de adicionar que o carácter de propósito.
—☈
:help NL-used-for-Nul
Detalhes técnicos:
<Nul>
caracteres no arquivo são armazenados como<NL>
na memória.Em exibição eles são mostrados como "^@
".A tradução é feita quando a leitura e a escrita ficheiros.Para corresponder a um<Nul>
com um padrão de busca você pode apenas entrar CTRL-@ ou "CTRL-V 000".Este é, provavelmente, apenas o que você espera.Internamente, o caractere é substituído por um<NL>
no padrão de pesquisa.O que é incomum é que a digitação CTRL-V CTRL-J também insere uma<NL>
, assim também procura por um<Nul>
no arquivo.{Vi não consegue processar<Nul>
caracteres no arquivo}
Primeiro de tudo, abra :h :s
para ver a seção "4.2 Substituto" de documentação em "Alterar".Aqui está o que o comando aceita:
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
Observe a descrição sobre pattern
e string
Para o
{pattern}
ver|pattern|
.
{string}
pode ser uma seqüência de caracteres literal, ou algo
especial;ver|sub-replace-special|
.
Então agora você sabe que o padrão de procura e substituição de padrões seguem regras diferentes.Se você seguir o link para |pattern|
, você leva para a seção que explica todo o regexp padrões utilizados no Vim.
Enquanto isso, |sub-replace-special|
leva você para a subseção de "4.2 Substituto", que contém os padrões para a substituição, de entre os quais \r
para quebra de linha/split.
(O atalho para esta parte do manual é :h :s%
)