Estou tentando substituir cada um ,
no arquivo atual por uma nova linha:
:%s/,/\n/g
Mas ele insere o que parece ser uma ^@
nova linha real. O arquivo não está no modo DOS nem nada.
O que devo fazer?
Se você estiver curioso, como eu, verifique a pergunta Por que a nova linha do Vim é? também.
Respostas:
Use em
\r
vez de\n
.Substituindo por
\n
insere um caractere nulo no texto. Para obter uma nova linha, use\r
. Ao procurar uma nova linha, você ainda usaria\n
. Essa assimetria se deve ao fato de que\n
e\r
fazer coisas ligeiramente diferentes :\n
corresponde ao final da linha (nova linha), enquanto\r
corresponde ao retorno de carro. Por outro lado, em substituições\n
insere um caractere nulo, enquanto\r
insere uma nova linha (mais precisamente, é tratada como entrada <CR>). Aqui está um pequeno exemplo não interativo para ilustrar isso, usando o recurso de linha de comando do Vim (em outras palavras, você pode copiar e colar o seguinte em um terminal para executá-lo).xxd
mostra um hexdump do arquivo resultante.Em outras palavras,
\n
inseriu o byte 0x00 no texto;\r
inseriu o byte 0x0a.fonte
\r
não funciona assim. Mas você pode pressionarCtrl-V
Enter
no lugar da digitação\r
e funciona.\r
insere<CR>
e\n
insere um valor nulo, como eu substituiria algo por um retorno de carro?Aqui está o truque:
Primeiro, defina sua sessão Vi (m) para permitir a correspondência de padrões com caracteres especiais (por exemplo: nova linha). Provavelmente vale a pena colocar esta linha no seu arquivo .vimrc ou .exrc:
Em seguida, faça:
Para obter o
^M
personagem, digite Ctrl+ Ve pressione Enter. No Windows, façaCtrl + Q, Enter. A única maneira de me lembrar disso é lembrando o pouco sentido que eles fazem:fonte
:set magic
(não está no meu ~ / _vimrc) nemctrl-q
. Apenas um simplesctrl-v
seguido de enter cria o^M
personagem para mim.Ctrl-C
na verdade, não mata o editor, embora possa cancelar você de volta ao modo Normal.Ctrl-V
significa literalmente eCtrl-Q
significa que alguém cometeu o erro de carregar o$VIMRUNTIME/mswin.vim
arquivo de configuração. Você não precisa de mswin. Basta usar seu próprio vimrc.sed -n l
até agora. É bom saber que o mesmo pode ser alcançado com oCtrl-v
vim.Na sintaxe
s/foo/bar
,\r
e\n
têm significados diferentes, dependendo do contexto.Baixo:
Para
foo
:\ n = nova linha (LF no Linux / Mac, CR + LF no Windows)
\ r = retorno de carro (CR)
Para
bar
:\ r = é nova linha
\ n = byte nulo.
Mais (com números ASCII):
NUL
= 0x00 = 0 = Ctrl+ @LF
= 0x0A = 10 = Ctrl+ JCR
= 0x0D = 13 = Ctrl+MAqui está uma lista dos caracteres de controle ASCII . Insira-os no Vim via Ctrl+ V, Ctrl+ ---key---.
No Bash ou nos outros shells Unix / Linux, digite Ctrl+---key--- .
Experimente Ctrl+ Mno Bash. É o mesmo que bater Enter, pois o shell percebe o que se entende, mesmo que os sistemas Linux usem feeds de linha para delimitar linhas.
Para inserir literais no bash, anexá-los com Ctrl+ Vtambém funcionará.
Experimente no Bash:
Isso usa seqüências de escape ANSI . Insira os dois
^[
via Ctrl+ V,Esc .Você também pode tentar Ctrl+ V, Ctrl+ M, Enterque lhe dará o seguinte:
Lembre o
\r
de cima? :>Essa lista de caracteres de controle ASCII é diferente de uma tabela de símbolos ASCII completa , pois os caracteres de controle inseridos em um console / pseudoterminal / Vim viaCtrl tecla (haha) podem ser encontrados lá.
Enquanto em C e na maioria dos outros idiomas, você geralmente usa os códigos octais para representar esses 'caracteres'.
Se você realmente quer saber de onde tudo isso vem: O TTY desmistificado . Este é o melhor link que você encontrará sobre esse tópico, mas cuidado: existem dragões.
TL; DR
Normalmente
foo
=\n
ebar
=\r
.fonte
:s/x/^M/g
deve fazer. Insira a^M
viactrl-v
seguida porctrl-m
.Você precisa usar:
Para obter o
^M
personagem, pressione Ctrl+ vseguido de Enter.fonte
\r
pode fazer o trabalho aqui para você.fonte
Com o Vim no Windows, use Ctrl+ Qno lugar de Ctrl+ V.
fonte
Esta é a melhor resposta para o meu modo de pensar, mas teria sido melhor em uma tabela:
Por que uma nova linha para o Vim?
Então, reformulando:
Você precisa
\r
usar um avanço de linha (ASCII0x0A
, a nova linha Unix) em uma substituição de regex, mas isso é peculiar à substituição - normalmente você deve continuar esperando o uso\n
de avanço de linha e\r
retorno de carro.Isso ocorre porque o Vim foi usado
\n
em um substituto para significar o caractere NIL (ASCII0x00
). Em\0
vez disso, você poderia esperar que o NIL estivesse liberando\n
seu uso usual para o avanço de linha, mas\0
já tem um significado nas substituições de expressões regulares, portanto foi alterado para\n
. Portanto, indo além, também mude a nova linha de\n
para\r
(que em um padrão regex é o caractere de retorno de carro, ASCII0x0D
).NB:
^M
( Ctrl+ V Ctrl+ Mno Linux) insere uma nova linha quando usada em uma substituição de regex em vez de um retorno de carro, como outros recomendaram (eu apenas tentei).Observe também que o Vim converterá o caractere de avanço de linha quando ele for salvo em um arquivo com base em suas configurações de formato de arquivo e isso pode confundir assuntos.
fonte
No Eclipse , os
^M
caracteres podem ser incorporados em uma linha e você deseja convertê-los em novas linhas.fonte
Mas se alguém tiver que substituir, o seguinte funcionará:
Acima, todas as próximas linhas são substituídas pelas próximas e, em seguida,
|-
uma nova linha. Isso é usado nas tabelas wiki.Se o texto for o seguinte:
É alterado para
fonte
Se você precisar fazer isso para um arquivo inteiro, também me foi sugerido que você poderia tentar na linha de comando:
fonte
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
ver se funcionará no seu sistema. (Crédito para o bom povo de #bash na freenode para esta sugestão.)Aqui está a resposta que funcionou para mim. Desse cara:
---- citação Use o editor vi para inserir um novo caractere de linha em substituir
Outra coisa que tenho que fazer e não consigo me lembrar e depois tenho que olhar para cima.
No vi, para inserir um caractere de nova linha em uma pesquisa e substituir, faça o seguinte:
O comando acima substitui todas as instâncias de "look_for" por "replace_with \ n" (com \ n significa nova linha).
Para obter o “^ M”, digite a combinação de teclas Ctrl+ Ve depois (solte todas as teclas) pressione a Entertecla.
fonte