Como replace um personagem por uma nova linha no Vim?

Estou tentando replace cada um , no arquivo atual por uma nova linha:

 :%s/,/\n/g 

Mas ele insere o que parece ser um ^@ vez de uma nova linha real. O arquivo não está no modo DOS nem nada.

O que devo fazer?

Se você é curioso, como eu, verifique a pergunta Por que \ ra nova linha para o Vim? também.

   

Use \r vez de \n .

Substituir por \n insere um caractere nulo no texto. Para obter uma nova linha, use \r . Ao procurar por uma nova linha, você ainda usaria \n , no entanto. Essa assimetria é devida ao fato de \n e fazerem coisas um pouco diferentes :

\n corresponde a um fim de linha (nova linha), enquanto \r corresponde a um retorno de carro. Por outro lado, em substituições \n insere um caractere nulo enquanto insere uma nova linha (mais precisamente, é tratado como a input ). 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.

 echo bar > test (echo 'Before:'; xxd test) > output.txt vim test '+s/b/\n/' '+s/a/\r/' +wq (echo 'After:'; xxd test) >> output.txt more output.txt 
 Before: 0000000: 6261 720a bar. After: 0000000: 000a 720a ..r. 

Em outras palavras, \n inseriu o byte 0x00 no texto; \r inseriu o byte 0x0a.

Aqui está o truque:

Primeiro, defina sua session do vi (m) para permitir a correspondência de padrões com caracteres especiais (por exemplo: newline). Provavelmente vale a pena colocar essa linha em seu arquivo .vimrc ou .exrc.

 :set magic 

Em seguida, faça:

 :s/,/,^M/g 

Para obter o caractere ^M , digite Controlv e pressione Enter . No Windows, faça Controlq , Enter . A única maneira de me lembrar disso é lembrar o pouco sentido que eles fazem:

R: Qual seria o pior personagem de controle a ser usado para representar uma nova linha?

B: Ou q (porque geralmente significa “Quit”) ou v porque seria tão fácil digitar Controlc por engano e matar o editor.

A: Faça isso.

Na syntax s/foo/bar \r e \n têm diferentes significados, dependendo do contexto.


Para foo :
\ n = nova linha
\ r = CR (retorno de carro = Ctrl-M = ^ M)

Para bar :
\ r = é nova linha
\ n = byte nulo (0x00).


Eu tenho visto perguntas sobre essas coisas, muitas vezes no passado, e em algum momento no futuro, quase ninguém vai saber nada sobre isso, eventualmente …

Por pedido “popular”:

Aqui 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, simplesmente digite CTRL --- key --- . Tente CTRL M no bash, é o mesmo que apertar ENTER , pois o shell percebe o que significa, mesmo que os sistemas Linux usem Line Feeds para delimitação de linha. Apenas o caractere de controle para o Line Feed é CTRL-A , que é obrigado a ‘pular para o início da linha’ no bash.

Para inserir literais no bash, o CTRL v também funcionará.

Tente no bash:

 echo ^[[33;1mcolored.^[[0mnot colored. 

Isso usa sequências de escape ANSI , insira os dois ^[ s via CTRL v ESC .

Você também pode tentar CTRL v CTRL m ENTER , que lhe dará isto:

 bash: $'\r': command not found 

Lembre-se de cima? :>

A lista de caracteres de controle ASCII é diferente da tabela de símbolos ascii padrão, em que os caracteres de controle, que são inseridos em um console / pseudoterminal / vim através da tecla CTRL (haha), podem ser encontrados lá. Enquanto que em C e na maioria das outras linguagens você costuma usar os códigos octal para representar esses ‘caracteres’.

Se você realmente quer saber de onde tudo isso vem: http://www.linusakesson.net/programming/tty/ .
Este é o melhor link que você encontrará neste tópico, mas cuidado: existem dragões.


TL; DR

Geralmente foo = \n e bar = \r .

Você precisa usar

 :%s/,/^M/g 

Para obter o caractere ^M , pressione Ctrl v seguido de Enter

pode fazer o trabalho aqui para você.

Com o Vim no Windows, use Ctrl + Q no lugar de Ctrl + V

Do eclipse, os caracteres ^M podem ser incorporados em uma linha e você deseja convertê-los em novas linhas.

 :s/\r/\r/g 

Mas se alguém tem que replace então seguindo trabalhos de coisa

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

no acima, cada linha seguinte é substituída pela próxima linha e depois | – e novamente a próxima linha. Isso é usado em tabelas wiki. se o texto é o seguinte:

 line1 line2 line3 

é alterado para

 line1 |- line2 |- line3 

Esta é a melhor resposta para o que eu penso, mas teria sido melhor em uma tabela: https://stackoverflow.com/a/12389839/962394 .

Então, reformulando:

Você precisa usar \r para usar um feed de linha (ascii 0x0a , a nova linha do UNIX) em uma substituição de regex mas que é peculiar à substituição – normalmente você deve continuar a usar \n para alimentação de linha e \r para retorno de carro .

Isso ocorre porque o vim usou \n em uma substituição para significar o caractere NIL (ascii 0x00 ). Você pode esperar que o NIL tenha sido \0 vez disso, liberando \n para seu uso usual para alimentação de linha, mas \0 já tem um significado nas substituições de regex, então foi deslocado para \n . Daí então indo além para também mudar a nova linha de \n para \r (que em um padrão regex é o caractere de retorno de carro, ascii 0x0d ).

 personagem |  código ascii |  Representação C |  regex match |  substituição de regex
 ------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
 nil |  0x00 |  \ 0 |  \ 0 |  \ n
 feed de linha (nova linha do unix) |  0x0a |  \ n |  \ n |  \ r
 retorno de carro |  0x0d |  \ r |  \ r |  

NB: ^M (Ctrl-V Ctrl-M no linux) insere uma nova linha quando usado em um substituto de expressão regular em vez de um retorno de carro como outros aconselham (eu tentei).

Observe também que o vim irá traduzir o caractere de alimentação de linha quando for salvo no arquivo com base em suas configurações de formato de arquivo e isso pode confundir os problemas.

Se você precisa fazer para um arquivo inteiro, também foi sugerido para mim que você poderia tentar a partir da linha de comando

 sed 's/\\n/\n/g' file > newfile 

Aqui está a resposta que funcionou para mim. Desse cara

—- citando http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Algo mais que tenho que fazer e não consigo lembrar e depois tenho que olhar para cima.

No vi para inserir um caractere de nova linha em uma pesquisa e substituição, faça o seguinte:

:% s / look_for / replace_with ^ M / g o comando acima replaceia todas as instâncias de “look_for” por “replace_with \ n” (com \ n significando nova linha)

para obter o “^ M”, insira a combinação de teclas “ctl-V” e depois disso (libere todas as teclas) pressione a tecla “enter”.