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 dd
não é uma boa opção. Pode haver muitas linhas.
1GdG
funcionaria de qualquer lugar.echo | test.txt
não é um comando válido, a menos quetest.txt
seja um script executável. Acho que você quer dizer emecho >test.txt
vez disso?vi
,>test.txt
é suficiente para truncá-lo com comprimento zero - não éecho
necessário.Respostas:
Em
vi
fazerpara 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
d
significa excluir as linhas indicadas.Existe uma forma mais curta (
:%d
), mas eu nunca me uso dela. A:1,$d
podem ser mais facilmente "adaptada" para, por exemplo,:4,$-2d
deixando apenas os 3 primeiros e últimos 2 linhas, excluir o resto.fonte
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
.
próxima vez repetir um comandoNo vi eu uso
Onde
:
diz ao vi para entrar no modo de comando%
significa todas as linhasd
: excluirNa linha de comando,
vai fazer também.
Qual é o problema do dd?
Onde
/dev/null
é um arquivo especial de 0 byteif
é o arquivo de entradaof
é o arquivo de saídafonte
dd
eu preciso de pess para cada linha no arquivo.dd
o comando vi (que significava o OP) edd
o utilitário, do qual você fornece um exemplo. Além disso,> test.txt
pode não funcionar como esperado em shells que não sejam do bash (por exemplo, zsh).: >test.txt
que é apenas muito marginalmente mais longo.Eu recomendo que você faça isso (deve funcionar em qualquer shell compatível com POSIX):
Se você realmente deseja fazer isso com o vi, pode:
fonte
G
representa a última linha. Se você estiver na primeira linha (gg
),dG
diz 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.gg
é específico do vim. Está1G
no vi tradicional.>| test.txt < /dev/null
é um pouco mais robusto, pois sempre atrapalha o arquivo e evita a espera de entrada nos terminais interativos.Se o cursor estiver na primeira linha (se não estiver, digite:
gg
ou1G
), você poderá usardG
. 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
%d
em 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?
fonte
dG
é o que eu sempre uso.ggdG
) o método mais fácil no vim. A razão pela qual essa resposta não é votada como outras é quegg
não existe no puro vi?Sou um cara preguiçoso e gosto de simplificar.
ggdG
são cinco pressionamentos de tecla, incluindoShift
gg
vai para a primeira linha do arquivo,d
é o início dod
verbo elete eG
é 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.fonte
:$d
ou:1,$d
é o caminho mais rápido (escrevo menos caracteres) kkk:%d
é uma boa alternativa, pois você também usa apenas 5 pressionamentos de tecla.gg
é umvim
comando, nãovi
.Vá para o início do arquivo e pressione dG.
fonte
Eu sempre uso
ggVG
gg
pula para o início do arquivo de edição atualV
(v maiúsculo) selecionará a linha atual. Nesse caso, a primeira linha do arquivo de edição atualG
(g maiúsculo) pulará para o final do arquivo. Nesse caso, desde que selecionei a primeira linha,G
selecionarei o texto inteiro neste arquivo.Então você pode simplesmente pressionar
d
oux
para excluir todas as linhas.fonte
d
vertical, ele será aplicado automaticamente na linha.dl
exclui um caractere para a direita,dj
exclui uma linha para baixo, por exemplo.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 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 atualO sugerido
:1,$d
também é bom, é claro, e enquanto estou nisso, também há1GdG
fonte
:!:>%
também é perigoso, poisvi
nã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("%")))
Outra solução:
fonte
>file
mas OK.Tipo
:
e%d
(Não está no modo de inserção. Se sim, pressione Escape primeiro)
fonte
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.
fonte
Digito
gg
para chegar ao topo das linhas e, em seguida, faço a100 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.fonte
Você nem precisa abrir o vi, a menos que realmente queira.
fonte
bash: > file.txt: command not found
."> file.txt"
.: vi >file.txt
;-)