¿Cómo puedo eliminar todas las líneas en un archivo usando vi?
Por el momento lo hago usando algo como esto para eliminar todas las líneas en un archivo:
echo > test.txt
¿Cómo puedo eliminar todas las líneas usando vi?
Nota:
Usar ddno es una buena opción. Puede haber muchas lineas.

1GdGfuncionaría desde cualquier lugar.echo | test.txtno es un comando válido, a menos quetest.txtsea un script ejecutable. Supongo que quieres decir en suecho >test.txtlugar?vi,>test.txtes suficiente para truncar a la longitud cero - noechoes necesario.Respuestas:
En
vihacerpara borrar todas las líneas.
El
:introduce un comando (y mueve el cursor hacia abajo).El
1,$es una indicación de en qué líneasddebería funcionar el siguiente comando ( ). En este caso, el rango de la línea uno a la última línea (indicado por$, por lo que no necesita saber el número de líneas en el documento).El final
dsignifica eliminar las líneas indicadas.Hay una forma más corta (
:%d) pero nunca me encuentro usándola. Se:1,$dpueden "adaptar" más fácilmente, por ejemplo,:4,$-2ddejando solo las primeras 3 y últimas 2 líneas, eliminando el resto.fuente
ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd....próxima vez repetir un comandoEn vi yo uso
dónde
:le dice a vi que vaya en modo comando%significa todas las líneasd: EliminarEn la línea de comando,
lo haré también
¿Cuál es el problema con dd?
dónde
/dev/nulles un archivo especial de 0 bytesifes el archivo de entradaofes el archivo de salidafuente
ddnecesito pesa para cada línea en el archivo.ddel comando vi (que significa OP) yddla utilidad, de la que da un ejemplo. Además,> test.txtpuede no funcionar como se esperaba en shells que no sean bash (por ejemplo, zsh).: >test.txtque es solo marginalmente más largo.Recomiendo que haga esto (debería funcionar en cualquier shell compatible con POSIX):
Si realmente quieres hacerlo con vi, puedes hacerlo:
fuente
Grepresenta la última línea Si está en la primera línea (gg),dGle dice a vi que elimine todas las líneas de la línea actual (primera línea) a la última línea. Entonces, lo haces de una vez.gges vim específico. Está1Gen vi tradicional.>| test.txt < /dev/nulles algo más robusto ya que siempre bloqueará el archivo y evitará esperar la entrada en terminales interactivos.Si su cursor está en la primera línea (si no, escriba:
ggo1G), entonces puede usarlodG. Eliminará todas las líneas desde la línea actual hasta el final del archivo. Entonces, para asegurarse de que eliminará todas las líneas del archivo, puede mezclar ambas, que serían:ggdG(mientras está en modo comando).O
%den el modo Ex, ejemplo de línea de comandos:vim +%d foo.bar.Relacionado: ¿Cómo puedo eliminar en VIM todo el texto desde la línea actual hasta el final del archivo?
fuente
dGes lo que siempre uso.ggdG) el método más fácil en vim. La razón por la que esta respuesta no se vota como otras es porqueggno existe en vi puro.Soy un tipo perezoso y me gusta que sea sencillo.
ggdGson cinco pulsaciones de teclas incluidasShiftggva a la primera línea del archivo,des el comienzo deldverbo elete yGes el movimiento para ir al final del archivo. Verbosely, es ir al principio del archivo y eliminar todo hasta el final del mosaico.fuente
:$do:1,$des la forma más rápida (escribo menos caracteres) kkk:%des una buena alternativa, ya que solo usas 5 teclas de esa manera también.gges unvimcomando, novi.Vaya al comienzo del archivo y presione dG.
fuente
Yo siempre uso
ggVGggsalta al inicio del archivo de edición actualV(v en mayúscula) seleccionará la línea actual. En este caso, la primera línea del archivo de edición actualG(g en mayúscula) saltará al final del archivo. En este caso, dado que seleccioné la primera línea,Gseleccionaré el texto completo en este archivo.Luego puede simplemente presionar
doxpara eliminar todas las líneas.fuente
dverticalmente, se aplica automáticamente en línea.dlelimina un carácter a la derecha,djelimina una línea hacia abajo, por ejemplo.tenga en cuenta que en su pregunta,
echo > test.txtcrea un archivo con un solo salto de línea, no un archivo vacío.Desde el shell, considere usar
echo -n > test.txto: > test.txt.Si bien generalmente usaría un comando de edición vi (yo uso
ggdG), también puede llamar al shell con una referencia al archivo actual de la siguiente manera:Es casi tan conciso como
ggdG, pero más difícil de escribir, y también debe confirmar que desea volver a cargar el archivo modificado, por lo que no lo recomiendo especialmente en este caso, pero saber cómo usar comandos de shell de vi como este es útil.desglosándolo:
:iniciar un comando vi!iniciar un comando de shell:Este es un comando integrado de shell con salida vacía>redirigir la salida%vi sustituye esto con el nombre del archivo actualLo sugerido
:1,$dtambién es bueno, por supuesto, y mientras estoy en eso también hay1GdGfuente
:!:>%También es peligroso yavique no escapa el nombre del archivo para el shell (no lo haga al editar un archivo llamado$(reboot)por ejemplo). Necesitarías algo:call system(":>" . shellescape(expand("%")))Otra solución:
fuente
>filepero está bien.Tipo
:y%d(No en modo de inserción. Si es así, presione escapar primero)
fuente
Puedes usar un truco para eliminar una gran cantidad de líneas. Asegúrese de no estar en modo de inserción (presione ESC) y luego escriba 1000dd.
fuente
Escribo
ggpara llegar a la parte superior de las líneas y luego hago un100 dd. Esto lleva el puntero a la línea superior del editor y borra 100 líneas desde allí. Puede que tenga que ajustar el número para agregar más líneas si el archivo es más largo.fuente
Ni siquiera tiene que abrir vi a menos que realmente quiera.
fuente
bash: > file.txt: command not found."> file.txt".: vi >file.txt;-)