Como posso apagar todas as linhas em um arquivo usando o vi?

234

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

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

echo > test.txt

Como posso excluir todas as linhas usando vi ?

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

    
por Cold 13.10.2014 / 13:32

10 respostas

415

Em vi do

:1,$d

para excluir todas as linhas.

O : introduz um comando (e move o cursor para a parte inferior).
O 1,$ é uma indicação de quais linhas o comando a seguir ( d ) deve funcionar. Nesse caso, o intervalo da linha um até a última linha (indicado por $ , para que você não precise saber o número de linhas no documento). O% final d significa excluir as linhas indicadas.

Existe um formulário mais curto ( :%d ), mas me vejo nunca usando. O :1,$d pode ser mais facilmente "adaptado" a, e. :4,$-2d deixando apenas as primeiras 3 e as últimas 2 linhas, excluindo o restante.

    
por 13.10.2014 / 13:35
144

No vi eu uso

:%d

onde

  • : diz ao vi para entrar no modo de comando
  • % significa toda a linha
  • d : delete

Na linha de comando,

> test.txt

também funcionará.

Qual é o problema com o 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
por 13.10.2014 / 13:41
49

Eu recomendaria que você fizesse isso (deveria funcionar em qualquer shell compatível com POSIX):

> test.txt

Se você realmente quiser fazer isso com o vi, faça:

  • 1G (vá para a primeira linha)
  • dG (excluir para a última linha)
por 13.10.2014 / 13:35
25

Se o seu cursor estiver na primeira linha (se não, digite: gg ou 1G ), então você pode usar apenas dG . Ele excluirá todas as linhas da linha atual até o final do arquivo. Portanto, para ter certeza de que você excluirá todas as linhas do arquivo, você poderá misturá-las, o que seria: ggdG (no modo de comando).

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

Relacionado:

    
por 13.10.2014 / 18:19
22

Sou um cara preguiçoso e gosto de simplificar. ggdG é cinco pressionamentos de tecla incluindo Shift

gg vai para a primeira linha do arquivo, d é o início do verbo d elete e G é o movimento para ir para o final do arquivo. Verbosamente, é ir para o início do arquivo e excluir tudo até o final do bloco.

    
por 15.10.2014 / 17:48
10

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

    
por 15.10.2014 / 07:30
3

Eu sempre uso ggVG

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

Você pode simplesmente pressionar d ou x para excluir todas as linhas.

    
por 14.10.2014 / 22:19
3

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

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

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

:!:>%

É 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 especialmente nesse caso, mas saber usar o shell comandos do vi assim são úteis.

quebrando:

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

O :1,$d sugerido também é bom, é claro, e só enquanto eu estou nisso também há 1GdG

    
por 17.10.2014 / 07:36
3

Outra solução:

truncate -s 0 file
    
por 15.07.2016 / 16:05
0

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

    
por 16.10.2018 / 09:04