Pergunta

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

:%s/,/\n/g 

Mas ele insere o que se parece com um ^@ em vez de uma nova linha.O arquivo não está no modo ms-DOS ou qualquer coisa.

O que devo fazer?

Se você é curioso, gosta de mim, verifique a questão Por que é uma nova linha para que Vim? bem.

Foi útil?

Solução

Utilização \r em vez de \n.

Substituir por \n insere um caractere nulo no texto.Para obter uma quebra de linha, use \r.Quando procura para uma nova linha, você ainda iria usar \n, no entanto.Essa assimetria é devido ao fato de que \n e \r fazer coisas ligeiramente diferentes:

\n corresponde a um fim-de-linha (newline), considerando que \r corresponde a um retorno de carro.Por outro lado, em substituições \n insere um caractere nulo considerando que \r insere uma quebra de linha (mais precisamente, ela é tratada como a entrada <CR>).Aqui está um pequeno, não-interativo exemplo para ilustrar isso, utilizando a linha de comandos do Vim recurso (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 tem de inserir o byte 0 x 00 para o texto; \r tem de inserir o byte 0x0a.

Outras dicas

Aqui está o truque:

Primeiro, defina o seu vi(m) sessão para permitir a correspondência de padrão com caracteres especiais (ie:nova linha).É provavelmente vale a pena colocar essa linha no seu .vimrc ou .exrc arquivo.

:set magic

Em seguida, faça:

:s/,/,^M/g

Para obter o ^M personagem, tipo Controle-v e bater Entrar.No Windows, fazer Controle-q, Entrar.A única maneira que eu me lembre, esses é por lembrar como o pouco sentido que elas fazem:

A: O que seria o pior de caracteres de controle para usar para representar uma nova linha?

B: Ou q (porque, geralmente, significa "Sair") ou v porque seria tão fácil para o tipo de Controle-c por engano, e matar o editor.

A: Fazê-lo assim.

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


curta:

Para foo:
= nova linha (LF no linux/mac, CRLF no windows)
= retorno de carro (CR)

Para bar:
= é newline
= byte nulo.

mais:(com ascii números)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

Aqui está uma lista de Caracteres de controle ASCII, inseri-los em vim via CTRLvCTRL---chave---.
No bash ou outro unix/linux conchas basta digitar CTRL---chave---.Tente CTRLM no bash, o mesmo que bater ENTRAR, como a shell realiza o que significa, apesar de sistemas linux usar Alimentações de Linha para a linha de delimitação.

Para inserir literal em bash, preceder-los com CTRLv também irá funcionar.

Tente no bash:

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

Este usa Sequências de escape ANSI, insira as duas ^['s através CTRLvESC.

Você também pode tentar CTRLvCTRLmENTRAR, que irá dar-lhe este:

bash: $'\r': command not found

Lembre-se o \r de cima?:>

Este Caracteres de controle ASCII lista é diferente de uma completa ASCII tabela de símbolos, em que os caracteres de controle, que são inseridos em um console/pseudoterminal/vim através do CTRL chave (haha), pode ser encontrado lá.Considerando que, no C e a maioria das outras línguas que você costuma usar o octal códigos para representar estes 'caracteres'.

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


TL;DR

Normalmente foo = \n, e bar = \r.

Você precisa usar

:%s/,/^M/g

Para obter o ^M carácter, prima Ctrl v seguido por Entrar

\r pode fazer aqui o trabalho para você.

Com o Vim no Windows uso Ctrl+Q em lugar de Ctrl+V

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

Assim, reformulação:

Você precisa usar \r para utilizar uma alimentação de linha (ascii 0x0a, o unix newline) em substituição de uma regex, mas que lhe é peculiar, para a substituição - normalmente, você deve continuar a esperar para usar \n para a linha de alimentação e \r para o transporte de devolução.

Isto porque vim usado \n em uma substituição para dizer o NIL caracteres (ascii 0x00).Você poderia ter esperado NIL ter sido \0 em vez disso, liberando \n para seu uso habitual para alimentação de linha, mas \0 já tem um significado em regex substituições então, foi deslocado para \n.Daí, em seguida, ir mais longe para deslocação a nova linha de \n para \r (o que, em um regex padrão é o caractere de retorno de carro, ascii 0x0d).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB: ^M (Ctrl-V Ctrl-M no linux) insere uma nova linha quando utilizado em substituição de uma regex, ao invés de um retorno de carro, como outros têm aconselhado (eu apenas tentei).

Observe também que o vim irá traduzir o carácter de avanço de linha quando ele a salva de arquivo com base em suas configurações de formato de arquivo e que possam confundir assuntos.

A partir do eclipse, o ^M caracteres podem ser inseridos em uma linha e você deseja convertê-los para novas linhas.

:s/\r/\r/g

Mas se alguém tem de substituir, em seguida, seguinte coisa funciona

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

acima de cada linha seguinte é substituído com a seguinte linha e, em seguida, | - e, novamente, a próxima linha.Este é usado na wiki tabelas.se o texto é o seguinte:

line1
line2
line3

é alterado para

line1
|-
line2
|-
line3

Se o que você precisa fazer para um arquivo inteiro, foi sugerido também 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.A partir desse cara

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


Outra coisa que eu tenho que fazer e não se lembrar e, em seguida, ter de 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 irá substituir todas as ocorrências de "look_for" com "replace_with " (com significa newline)

para obter o "^M", introduza a combinação de teclas "ctl-V", em seguida, depois que (soltar todas as teclas) pressione a tecla "enter".


Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top