it-swarm-pt.tech

Como substituir um personagem por uma nova linha no Vim

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

:%s/,/\n/g 

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

O que devo fazer?

Se você está curioso, como eu, verifique a questãoPor que é uma nova linha para o Vim?também.

1755
Vinko Vrsalovic

Use \r em vez de \n.

Substituindo por \n insere um caractere nulo no texto. Para obter uma nova linha, use \r. Quando pesquisar para uma nova linha, você ainda usará \n, no entanto. Essa assimetria se deve ao fato de que \n e \rfazem coisas ligeiramente 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 \r insere uma nova linha (mais precisamente, é tratado como entrada <CR>). Veja um pequeno exemplo não interativo para ilustrar isso, usando o recurso de linha de comando do Vim (em outras palavras, é possível 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.

2317
Konrad Rudolph

Aqui está o truque:

Primeiro, defina sua sessão 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 Control-v e acertar Enter. No Windows, faça Control-qEnter. A única maneira de me lembrar disso é lembrar o pouco sentido que eles fazem:

A: Qual seria o pior personagem de controle para representar uma nova linha?

B: ou q (porque geralmente significa "Quit") ou v porque seria muito fácil digitar Control-c por engano e matar o editor.

A: Faça isso.

184
Logan

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


baixo:

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

Para bar:
\r = é nova linha
\n = byte nulo.

mais tempo: (com números ascii)

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

Aqui está uma lista de caracteres de controle ASCII , insira-os em vim via CTRLvCTRL---key---.
Em bash ou os outros shells unix/linux apenas digite CTRL---key---. Experimentar CTRLM na bash, é o mesmo que bater ENTER, como o Shell percebe o que se entende, mesmo que os sistemas Linux usem Line Feeds para delimitação de linha.

Para inserir literais no bash, prefixando-os com CTRLv também funcionará.

Tente no bash:

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

Isso usa sequências de escape ANSI , insira os dois ^[ via CTRLvESC.

Você também pode tentar CTRLvCTRLmENTER, que lhe dará isto:

bash: $'\r': command not found

Lembre-se do \r acima? :>

Este caracteres de controle ASCII lista é diferente de um completo tabela de símbolos ASCII , em que os caracteres de controle, que são inseridos em um console/pseudoterminal/vim via CTRL chave (haha), pode ser encontrado lá. Enquanto 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á sobre este tópico, mas cuidado: Haverá dragões.


TL; DR

Geralmente foo = \n e bar = \r.

84
sjas

Você precisa usar

:%s/,/^M/g

Para obter o caractere ^M, pressione Ctrlv Seguido por Enter

50
dogbane

\r pode fazer o trabalho aqui para você.

33
Lasar

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

22
grantc

Esta é a melhor resposta para a maneira 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 uma alimentação de linha (ascii 0x0a, a nova linha unix) em uma substituição de regex, mas isso é 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 ter esperado que o NIL tenha sido \0 em 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. Por isso, vá 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 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 zero | 0x00 |\0 |\0 |\n 
 feed de linha (nova linha do unix) | 0x0a |\n |\n |\r 
 retorno de carro | 0x0d |\r |\r | <desconhecido> 

NB: ^M (Ctrl-V Ctrl-M no linux) insere uma nova linha quando usado em uma substituição de regex em vez de um retorno de carro como outros aconselharam (eu tentei).

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

10
codeshot

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

:s/\r/\r/g
10
rickfoosusa

Mas se alguém tem que substituir então seguindo coisas

:%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
7
Kiran K Telukunta

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
6
Evan Donovan

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 substituiria 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 (solte todas as teclas) pressione a tecla “enter”.


4
user407749