Vim excluir linhas em branco

674

Que comando posso executar para remover linhas em branco no Vim?

almost_lunchtime
fonte

Respostas:

1232
:g/^$/d

:gexecutará um comando nas linhas que correspondem a uma regex. O regex é 'linha em branco' e o comando é :d(excluir)

soulmerge
fonte
38
Obrigado soulmerge. Esta é a minha resposta favorita, pois na verdade explica o que o comando: g faz.
Tim Swast 15/08/19
4
Isso excluirá todas as linhas vazias (não contém caracteres de espaço em branco ...), mas esse pode não ser o requisito exclusivo. Alguém ainda pode manter um da linha vazia. :%!cat -spode ser a escolha ..
coanor:
2
: g / ^ \ s * $ / d com um regex de 'qualquer possível caractere espaço' na linha
oyd11
180

Encontrei, é:

g/^\s*$/d

Fonte: Power of g na vim wikia

Breve explicação de :g

:[range]g/pattern/cmd

Isso age no [intervalo] especificado (arquivo inteiro padrão), executando o comando Ex cmd para cada padrão de correspondência de linha (um comando Ex é aquele que começa com dois pontos, como :dpara excluir). Antes de executar o cmd , " ." é definido como a linha atual.

almost_lunchtime
fonte
9
Agradável. Mas não é exatamente uma linha em branco.
InnaM 01/04/09
13
Ah, sim, isso corresponderá a linhas contendo apenas caracteres de espaço em branco. Vou aceitar a resposta de soulmerge.
nearly_lunchtime
16
que deve corresponder a linhas em branco E linhas compostas apenas por espaços em branco ... (* corresponde a zero ou várias instâncias de \ s ...)?
precisa saber é o seguinte
14
Eu diria que o espaço em branco puro É EXATAMENTE uma linha em branco, enquanto que nenhum espaço em branco é realmente mais uma linha em branco, não acha? ;)
Kasapo
4
Oxford diz que um espaço em branco é "um espaço a ser preenchido em um documento". Interprete isso como você pode, mas é exatamente isso que eu estava procurando. Obrigado!
31814 Joe Tricarico
53
:v/./d

ou

:g/^$/d

ou

:%!cat -s
mandaleeka
fonte
7
Truque interessante com o: v /./d (mais fácil de digitar), mas você precisará fazer um: nohl depois.
Claes Mogren
1
@ClaesMogren ou apenas salto no controle-l
JM3
6
@zladuric acordo com vim.wikia.com/wiki/Power_of_g é inversa global (assim faz o comando sobre tudo o que não corresponde)
adam_0
44

O seguinte pode ser usado para remover apenas várias linhas em branco (reduza-as a uma única linha em branco) e deixar intactas as linhas em branco:

:g/^\_$\n\_^$/d
Draemon
fonte
3
Alguém poderia explicar o que significam os tokens? (Então, como isso funciona?) Obrigado.
PAStheLoD
5
\_$significa o final da linha que pode ser usado dentro de um padrão ( $só pode ser usado no final do padrão). O mesmo ocorre com \_^isso significa o início de uma linha e pode ser usado em qualquer lugar dentro do padrão. Portanto, o padrão corresponde a uma linha vazia, uma nova linha e novamente uma linha vazia. Consulte a página de ajuda do Vim regex .
Wiktor Stribiżew 30/03
1
Outra maneira de fazer o mesmo::g/^$/,/./-j
SergioAraujo
14
  1. como remover todas as linhas em branco

    :%s,\n\n,^M,g
    

    (faça isso várias vezes util todas as linhas vazias foram embora)

  2. como remover todas as linhas em branco deixando ÚNICA linha vazia

    :%s,\n\n\n,^M^M,g
    

    (faça isso várias vezes)

  3. como remover todas as linhas em branco deixando DUAS linhas vazias no máximo,

    :%s,\n\n\n\n,^M^M^M,g
    

    (faça isso várias vezes)

para inserir ^ M, eu tenho que controlar-Q e control-M no Windows

gauge00
fonte
2
Você também pode usar \rno lugar do Ctrl-M.
traço-tom-bang
6

E se:

:g/^[ \t]*$/d

fonte
5

trabalhe com perl no vim:

:%!perl -pi -e s/^\s*$//g

niejieqiang
fonte
Meu perl pode estar um pouco enferrujado, mas chomptambém não faria o trabalho?
Mark K Cowan
5

Isso funciona para mim

:%s/^\s*$\n//gc

allenhwkim
fonte
Eu uso algo semelhante::%s/^\n//gc
Clint Pachl
5

Esta função remove apenas duas ou mais linhas em branco, coloque as linhas abaixo no seu vimrc e use \ d para chamar a função

fun! DelBlank()
   let _s=@/
   let l = line(".")
   let c = col(".")
   :g/^\n\{2,}/d
   let @/=_s
   call cursor(l, c)
endfun
map <special> <leader>d :keepjumps call DelBlank()<cr>
SergioAraujo
fonte
4

Tentei algumas das respostas nesta página, mas muitas delas não funcionaram para mim. Talvez porque eu esteja usando o Vim no Windows 7 (não zombe, só tenha pena de mim: p)?

Aqui está o mais fácil que eu achei que funciona no Vim no Windows 7:

:v/\S/d

Aqui está uma resposta mais longa no Vim Wikia: http://vim.wikia.com/wiki/Remove_unwanted_empty_lines

Limitado
fonte
3
:g/^\s*$/d
^ begin of a line
\s* at least 0 spaces and as many as possible (greedy)
$ end of a line

colar

:command -range=% DBL :<line1>,<line2>g/^\s*$/d

no seu .vimrc, reinicie o seu vim. se você usar o comando: 5,12DBL, ele excluirá todas as linhas em branco entre a quinta e a 12ª linha. Eu acho que minha resposta é a melhor resposta!

cn8341
fonte
Ao postar respostas, adicione uma explicação descrevendo o que você alterou ou adicionou ou como funciona ou algo assim. Embora sua resposta possa ser a solução, é provável que algumas pessoas que leem isso não entendam o que significa ou como funciona. E por favor faça isso em inglês.
Tim
Isso realmente não importa aqui. Esta questão aceitou uma resposta há 5 anos
Tim
Acho que a resposta de soulmerge: g / ^ $ / d não é a melhor resposta. E edito para melhorar sua resposta com: g / ^ \ s * $ / d. mas por que não consigo assistir minha edição em "mostrar todas as edições dessa pose"?
fácil
Minha resposta é melhor que a dele, e quem rejeitou minha resposta e por que minha resposta foi rejeitada?
cn8341
2

Se algo tiver linhas duplas no espaçamento do texto, esse comando removerá o espaçamento duplo e mesclará as linhas em branco repetidas preexistentes em uma única linha em branco. Ele usa um delimitador temporário de ^^^ no início de uma linha, portanto, se isso entrar em conflito com seu conteúdo, escolha outra coisa. Linhas contendo apenas espaço em branco são tratadas como em branco.

%s/^\s*\n\n\+/^^^\r/g | g/^\s*$/d | %s/^^^^.*
MisterW
fonte
2

Pressione a deletetecla no modo de inserção para remover linhas em branco.

akp
fonte
1

Isso funcionou para mim:

:%s/^[^a-zA-Z0-9]$\n//ig

Ele basicamente exclui todas as linhas que não possuem um número ou letra. Como todos os itens da minha lista tinham letras, todas as linhas em branco foram excluídas.

user1481441
fonte