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.

Frio
fonte
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.

Anthon
fonte
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
Archemar
fonte
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)
Chris Down
fonte
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?

kenorb
fonte
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.

TankorSmash
fonte
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
12

Vá para o início do arquivo e pressione dG.

cppcoder
fonte
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.

yegle
fonte
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

mc0e
fonte
:!:>%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
slawx
fonte
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

Tipo :e%d

(Não está no modo de inserção. Se sim, pressione Escape primeiro)

DimiDak
fonte
Observe que isso já foi publicado
Jeff Schaller
-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.

Radu
fonte
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.

Atul
fonte
-1
> file.txt

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

sombra
fonte
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