Como posso excluir todas as linhas de um arquivo usando o vi?


269

Como posso excluir todas as linhas de um arquivo usando o vi?

No momento, faço isso usando algo parecido com isto para remover todas as linhas de um arquivo:

echo > test.txt

Como posso excluir todas as linhas usando vi?

Nota: Usar ddnão é uma boa opção. Pode haver muitas linhas.


5
Eu acho que o dG deve funcionar.
MadTux 13/10

11
@ MadTux, somente se você iniciar na primeira linha. 1GdGfuncionaria de qualquer lugar.
Holloway

1
echo | test.txtnão é um comando válido, a menos que test.txtseja um script executável. Acho que você quer dizer em echo >test.txtvez disso?
Tripleee 13/10

Você está certo @tripleee
Cold

5
Observe que não usar vi, >test.txté suficiente para truncá-lo com comprimento zero - não é echonecessário.
abligh

Respostas:


473

Em vifazer

:1,$d

para excluir todas as linhas.

O :apresenta um comando (e move o cursor para o final).
A 1,$é uma indicação de que linhas a seguinte comando ( d) deve trabalhar. Nesse caso, o intervalo da linha um até a última linha (indicado por $, assim você não precisa saber o número de linhas no documento).
O final dsignifica excluir as linhas indicadas.

Existe uma forma mais curta ( :%d), mas eu nunca me uso dela. A :1,$dpodem ser mais facilmente "adaptada" para, por exemplo, :4,$-2ddeixando apenas os 3 primeiros e últimos 2 linhas, excluir o resto.


9
Dica profissional. Não maisESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 tente da .próxima vez repetir um comando
Gazihan Alankus

169

No vi eu uso

:%d

Onde

  • : diz ao vi para entrar no modo de comando
  • % significa todas as linhas
  • d : excluir

Na linha de comando,

> test.txt

vai fazer também.

Qual é o problema do dd?

dd if=/dev/null of=test.txt

Onde

  • /dev/null é um arquivo especial de 0 byte
  • if é o arquivo de entrada
  • of é o arquivo de saída

Eu estava pensando que usando ddeu preciso de pess para cada linha no arquivo.
Fria

Boa. É mais simples do que eu esperava ...
Fria

11
Você precisa distinguir entre ddo comando vi (que significava o OP) e ddo utilitário, do qual você fornece um exemplo. Além disso, > test.txtpode não funcionar como esperado em shells que não sejam do bash (por exemplo, zsh).
depquid 13/10

1
@depquid Oups! agora eu venho para pensar sobre isso ...
Archemar

2
Ou : >test.txtque é apenas muito marginalmente mais longo.
Tripleee 13/10

53

Eu recomendo que você faça isso (deve funcionar em qualquer shell compatível com POSIX):

> test.txt

Se você realmente deseja fazer isso com o vi, pode:

  • 1G (vá para a primeira linha)
  • dG (excluir para a última linha)

30
@ Cold: ... uma vez?
Chris Baixo

5
Grepresenta a última linha. Se você estiver na primeira linha ( gg), dGdiz ao vi para remover todas as linhas da linha atual (primeira linha) até a última linha. Então, você faz isso de uma só vez.
Jun

6
ggé específico do vim. Está 1Gno vi tradicional.
Stéphane Chazelas

1
Sua sintaxe do shell depende da configuração de alguns shells. Os shells interativos bash e zsh (zsh por padrão) podem aguardar a entrada no STDIN após receber esse comando e é necessário um <CTRL> + D adicional para limpar o arquivo. A capacidade de executar isso também depende das configurações de CLOBBER. >| test.txt < /dev/nullé um pouco mais robusto, pois sempre atrapalha o arquivo e evita a espera de entrada nos terminais interativos.
Caleb

1
@ Caleb: Como eu disse, em qualquer shell compatível com POSIX . :-) Nenhuma dessas duas situações é uma reclamação POSIX.
Chris Baixo

28

Se o cursor estiver na primeira linha (se não estiver, digite: ggou 1G), você poderá usar dG. Ele excluirá todas as linhas da linha atual até o final do arquivo. Portanto, para garantir que você exclua todas as linhas do arquivo, você pode misturar as duas, o que seria: ggdG(enquanto estiver no modo de comando).

Ou %dem modo Ex, exemplo de linha de comando: vim +%d foo.bar.

Relacionado: Como posso excluir no VIM todo o texto da linha atual até o final do arquivo?


3
+1 por ser mais ergonômico que: 1, $ d. Não que os dedos não estão ligados para digitar dois pontos o tempo todo agora, de qualquer maneira;)
Aaron R.

2
Votado. dGé o que eu sempre uso.
amigos estão

1
Acho esse ( ggdG) o método mais fácil no vim. A razão pela qual essa resposta não é votada como outras é que ggnão existe no puro vi?
Thameera 15/10

27

Sou um cara preguiçoso e gosto de simplificar. ggdGsão cinco pressionamentos de tecla, incluindoShift

ggvai para a primeira linha do arquivo, dé o início do dverbo elete e Gé o movimento para ir para a parte inferior do arquivo. De forma verbal, ele vai para o início do arquivo e exclui tudo até o final do bloco.


rsrs. Eu também sou preguiçoso e uso :$dou :1,$dé o caminho mais rápido (escrevo menos caracteres) kkk
Cold

3
:%dé uma boa alternativa, pois você também usa apenas 5 pressionamentos de tecla.
TankorSmash

1
@TankorSmash ggé um vimcomando, não vi.
Kyrias 15/10

boa captura, meu erro #
TankorSmash


5

Eu sempre uso ggVG

  • gg pula para o início do arquivo de edição atual
  • V(v maiúsculo) selecionará a linha atual. Nesse caso, a primeira linha do arquivo de edição atual
  • G(g maiúsculo) pulará para o final do arquivo. Nesse caso, desde que selecionei a primeira linha, Gselecionarei o texto inteiro neste arquivo.

Então você pode simplesmente pressionar dou xpara excluir todas as linhas.


Se você usar na dvertical, ele será aplicado automaticamente na linha. dlexclui um caractere para a direita, djexclui uma linha para baixo, por exemplo.
TankorSmash

3

observe que, na sua pergunta, echo > test.txtcria um arquivo com uma única quebra de linha, não um arquivo vazio.

No shell, considere usar echo -n > test.txtou : > test.txt.

Embora eu usasse geralmente um comando de edição do vi (eu uso ggdG), você também pode chamar o shell com uma referência ao arquivo atual da seguinte maneira:

:!:>%

É quase tão conciso quanto ggdG, mas mais difícil de digitar, e você também precisa confirmar que deseja recarregar o arquivo modificado, por isso não o recomendo particularmente neste caso, mas saber como usar comandos de shell do vi como este é útil.

dividindo:

  • : iniciar um comando vi
  • ! iniciar um comando shell
  • : este é um comando interno do shell com saída vazia
  • > redirecionar a saída
  • % vi substitui isso pelo nome do arquivo atual

O sugerido :1,$dtambém é bom, é claro, e enquanto estou nisso, também há1GdG


:!:>%também é perigoso, pois vinão escapa ao nome do arquivo do shell (não faça isso ao editar um arquivo chamado, $(reboot)por exemplo). Você precisaria de algo:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

Outra solução:

truncate -s 0 file

Não é realmente mais simples do que >filemas OK.
Ph16

1
Parece ser um bom método, mas o alvo está fazendo isso usando o vi. Tks
Cold


-1

Você pode usar um truque para excluir um grande número de linhas. Verifique se você não está no modo de inserção (pressione ESC) e digite 1000dd.


1
Você deve incluir a explicação sobre o que o comando faz / como funciona (exclui as próximas 1000 linhas, que não excluem todas as linhas se o cursor não estiver na primeira linha).
sebasth

é por isso que eu chamei-lhe um truque :)
Radu

-1

Digito ggpara chegar ao topo das linhas e, em seguida, faço a 100 dd. Isso leva o ponteiro para a linha superior do editor e limpa 100 linhas a partir daí. Pode ser necessário ajustar o número para adicionar mais linhas se o arquivo for mais longo.


-1
> file.txt

Você nem precisa abrir o vi, a menos que realmente queira.


1
Olá e bem-vindo ao site de troca de pilhas U&L. Consulte o centro de ajuda para obter informações sobre como melhor publicar este site. Queremos cultivar perguntas e respostas informativas e únicas neste site. Sua resposta é idêntica a outras respostas e comentários nesta postagem. Por favor edite seu post para ser uma resposta mais original e informativo, por favor. Obrigado!
kemotep

Além disso, o objetivo da pergunta é ... "using vi"
Jeff Schaller

Eu tentei exatamente o que você sugeriu. Eu tenho bash: > file.txt: command not found.
roaima 7/02

@roaima Você conseguiria isso se citar a coisa como "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
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.