Vim - Adicionando linha vazia entre as linhas

15

Como insiro uma linha em branco entre todas as linhas que não estão em branco?

por exemplo. de

line 1
line 2
line 3

line 4
line 5

para

line 1

line 2

line 3

line 4

line 5
    
por ayutheos 07.05.2013 / 06:33

7 respostas

26

O comando vim's: g é projetado exatamente para esse tipo de tarefa; executando uma única ação em cada linha que corresponda a um padrão específico. Aqui está minha resposta:

:g/.\n\n\@!/norm o

O padrão que eu uso é /.\n\n\@!/ . Quebrando isso em suas partes componentes:

  • . Corresponde a qualquer caractere na linha. (costumava descartar imediatamente quaisquer linhas vazias existentes de consideração)
  • \n Corresponde a um único \ n no final do caractere acima
  • \n\@! falha na correspondência se houver outra \ n imediatamente após o mais cedo \ n.

(Verifique :h E59 para obter mais informações sobre \@! e especificadores de correspondência semelhantes em expressões regulares - há outros pares também!)

Portanto, a regex do comando g: agora selecionou todas as linhas não vazias terminadas por uma única nova linha e que não são seguidas por uma linha vazia.

Após o padrão em uma instrução :g , o comando é executado em linhas correspondentes. Neste caso, eu disse a ele para executar um comando de modo normal (abreviado para norm ), e o comando para executar é simplesmente o , que insere uma linha vazia abaixo da linha atual.

Então, juntos, o comando encontra todas as linhas que não têm uma linha vazia abaixo e adicionam uma. E isso é tudo que existe para isso! Você pode checar o artigo do Poder do G do vim wiki para mais coisas interessantes que você pode fazer com :g (e é irmã negativa, :v ) - é um daqueles comandos incrivelmente úteis nos quais você logo se apóia, e depois perde terrivelmente em editores que não o possuem.

    
por 07.05.2013 / 08:51
3

Quando testei a resposta global de busca e substituição do @NeilForester, descobri que faltava a cada segundo a substituição pretendida em linhas não em branco consecutivas se as linhas tivessem apenas um caractere em cada. Isto parece ser devido ao padrão começar a combinar em cada ocasião após o último caractere que correspondeu à ocasião anterior.

O uso de lookbehind e lookahead soluciona esse problema e torna o regex um pouco mais curto também:

:%s/\n\@<!\n\n\@!/\r\r/g
    
por 07.05.2013 / 08:12
3

Outra maneira:

%s/\(.\)\n\(.\)/\r\r/

O que significa,

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

substitua por: primeira captura, novas linhas duplas e a segunda captura.

Por exemplo, line1\nLine2 resulta em = 1 e = L .

    
por 07.05.2013 / 08:29
0

Corrija-me se estiver errado. Eu acredito que você use a letra k quando em modo de comando para mover para baixo uma linha. Em seguida, insira o modo de inserção e adicione a próxima linha. Repita conforme necessário? Espero que isso ajude!

    
por 07.05.2013 / 06:36
0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

Em seguida, pressione <F2> . Isso irá procurar por duas linhas não em branco consecutivas e, em seguida, adicionar uma linha entre elas repetidamente.

Editar:

Aqui está uma maneira alternativa de fazer isso com uma única pesquisa global e substituir:

:%s/\([^\n]\)\n\([^\n]\)/\r\r/g
    
por 07.05.2013 / 06:37
0

Experimente este comando ( 16 caracteres):

:%!sed G|cat -s
    
por 07.05.2013 / 09:16
0

Eu não sei quanto tempo é o seu arquivo, mas um dos métodos mais simples é o tipo o no modo de comando. E na próxima linha . . Isso pode ser carregado para macro simples.

    
por 19.05.2013 / 23:43

Tags