Como posso adicionar uma string ao final de cada linha no Vim?


256

Quero adicionar *ao final de cada linha no Vim.

Eu tentei o código sem sucesso

:%s/\n/*\n/g

O seu não funciona porque, no lado direito :s///, \ncorresponde a um caractere nulo. A seção :help sub-replace-specialé relevante.
DoubleDown

Respostas:


354

:%s/$/\*/g

Deveria trabalhar. Assim :%s/$/*/gcomo MrWiggles aponta corretamente.


Existe uma maneira de inserir ' ' na mesma coluna, já que todas as linhas não têm o mesmo comprimento, portanto a linha 1 pode ter ' ' na 15ª coluna, mas a linha 2 tem '*' na 25ª coluna.
Aman Jain

11
existe apenas 1 EOL por linha; portanto, o gsinalizador é desnecessário.
DoubleDown

Eu queria adicionar / ao início de cada linha: 1, $ s / ^ / \ / g funcionou para mim.
farooqsadiq

@dirkgently Como posso passar uma variável de string como argumento para este comando (você sabe, em vez do *)?
Matheus Rotta

353

Ainda mais curto que o comando: search:

:%norm A*

Isto é o que significa:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Cara, não existe um vi ou vim thread do qual eu não aprendo algo. Hoje eu aprendo sobre norma. E como eles dizem no Cheers, "Norm!"
smcameron

4
Para anexar, basta usar 0i *, 0 o leva ao início da linha, i no modo de inserção e * no *. D:
Rob

7
Como VimGolfer, não posso deixar de acrescentar que o uso, em I*vez de 0i*, poupará um pressionamento de tecla.
Jedidiah ferir

24
Outra dica: isso também funciona para intervalos. Basta destacar as linhas no modo visual e de imprensa :, este irá pré-preencher o comando com :'<,'>o qual você pode então fazer para:'<,'>norm A*
Jedidiah dano

8
Para prepending, use Iem vez disso -:%norm I*
apenas afortunado Realmente

42

Além disso:

:g/$/norm A*

Além disso:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... O segundo também pode ser usado com uma seleção de linhas. Agradável!
Tim Fletcher

Poderia explicar o primeiro exemplo?
Cody Poll

@CodyPoll gé um globalcomando que faz algo com todas as linhas correspondentes. $corresponde a todas as linhas. Pode ser também ^ou .*. A norma executa comandos que você normalmente usa no modo de comando. Então, A*significa acrescentar *ao final da linha.
defhlt

41

Eu acho que usar o modo de bloqueio visual é um método melhor e mais versátil para lidar com esse tipo de coisa. Aqui está um exemplo:

This is the First line.  
This is the second.  
The third.

Para inserir "Olá, mundo". (espaço + área de transferência) no final de cada uma destas linhas:

  • Em um caractere na primeira linha, pressione Ctrl-V (ou Ctrl-Q se Ctrl-V estiver colado).
  • Pressione jj para estender o bloco visual por três linhas.
  • Pressione $ para estender o bloco visual até o final de cada linha. Pressione A e espaço e digite Hello world. + depois Esc.

O resultado é:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(exemplo de Vim.Wikia.com )


3
Em vez de pressionar, jjpode-se pressionar Gpara ir para a última linha. Isso é útil em arquivos grandes, onde pressionar jaté chegar à última linha não é prático.
Nash 29/11

Concorda que bloco visual é mais limpo aqui, mais extensível também
Peter Dolan

Observe que isso não parece estar funcionando em todas as linhas no início, mas depois que você pressiona Esc, ele passa e adiciona a todos.
Noumenon

O Visual Block causa problemas e erros ao usar o vim como uma extensão para outras coisas, como o VS Code. Nesses casos, a pesquisa e substituição do usuário original está solicitando é a opção confiável.
Brettins 11/11/19

certifique-se de usar a letra maiúscula A, "a" minúsculo não funciona.
Jeff Hoye 24/01

14

Se você deseja adicionar o Hello world no final de cada linha:

:%s/$/HelloWorld/

Se você quiser fazer isso para um número específico de linhas, digamos, de 20 a 30, use:

:20,30s/$/HelloWorld/

Se você quiser fazer isso no início de cada linha, use:

:20,30s/^/HelloWorld/

6

Você realmente não precisa gdo final. Então se torna:

:%s/$/*

Ou se você quiser apenas *o final de, diga as linhas 14-18:

:14,18s/$/*

ou

:14,18norm A*


5

Uma opção é:

:g/$/s//*

Isso encontrará todas as âncoras de extremidade da linha e a substituirá *. Eu digo "substituto", mas, na verdade, é mais um acréscimo, já que a âncora é uma coisa especial e não um personagem comum. Para mais informações, consulte Poder de g - Exemplos .


O que significa s // no regex? Eu conheço um comando semelhante,: g / / / p, (grep). Tenho certeza de que seu comando é próximo ao meu, pelo menos na estrutura.
Léo Léopold Hertz

1
O s é um substituto - substitui a âncora de fim de linha pelo asterisco (bem, na verdade não a substitui, pois é um ponto de ancoragem).
21420

3
:% s / \ n / * \ r / g

Seu primeiro está correto em qualquer outro lugar, mas o Vim precisa ter um tratamento de nova linha diferente por algum motivo.


Na minha versão do Vim \ n funciona, mas isso substitui a nova linha por um *, juntando-se efetivamente às linhas.
18419 Nathan Fellman

1
Este comando foi verificado para funcionar bem em todas as versões do Vim que eu tentei. Você está usando a versão do Windows ou algo assim?

1
%s/\s*$/\*/g

isso fará o truque e garantirá que os espaços iniciais sejam ignorados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.