¿Cómo puedo eliminar todas las líneas en un archivo usando vi?


269

¿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.


55
Creo que dG debería funcionar.
MadTux

11
@MadTux, solo si comienza en la primera línea. 1GdGfuncionaría desde cualquier lugar.
Holloway

1
echo | test.txtno es un comando válido, a menos que test.txtsea ​​un script ejecutable. Supongo que quieres decir en su echo >test.txtlugar?
tripleee

Tienes razón @tripleee
Cold

55
Tenga en cuenta que no se utiliza vi, >test.txtes suficiente para truncar a la longitud cero - no echoes necesario.
Abligh

Respuestas:


473

En vihacer

:1,$d

para 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íneas ddeberí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.


99
Consejo profesional No másESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 intenta la .próxima vez repetir un comando
Gazihan Alankus

169

En vi yo uso

:%d

dónde

  • : le dice a vi que vaya en modo comando
  • % significa todas las líneas
  • d : Eliminar

En la línea de comando,

> test.txt

lo haré también

¿Cuál es el problema con dd?

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

dónde

  • /dev/null es un archivo especial de 0 bytes
  • if es el archivo de entrada
  • of es el archivo de salida

Estaba pensando que usando ddnecesito pesa para cada línea en el archivo.
Frío el

Bueno. Es más simple de lo que esperaba ...
Cold

11
Debe distinguir entre ddel comando vi (que significa OP) y ddla 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).
depquid

1
@depquid Oups! ahora que lo pienso ...
Archemar

2
O : >test.txtque es solo marginalmente más largo.
tripleee

53

Recomiendo que haga esto (debería funcionar en cualquier shell compatible con POSIX):

> test.txt

Si realmente quieres hacerlo con vi, puedes hacerlo:

  • 1G (ir a la primera línea)
  • dG (eliminar a la última línea)

30
@Cold: ... una vez?
Chris Down

55
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.
unxnut

66
gges vim específico. Está 1Gen vi tradicional.
Stéphane Chazelas

1
Su sintaxis de shell depende de la configuración de algunos shells. Los shells interactivos bash y zsh (zsh por defecto) pueden esperar la entrada en STDIN después de recibir ese comando y se necesita un <CTRL> + D adicional para borrar el archivo. La capacidad de ejecución que también depende de la configuración de CLOBBER. >| test.txt < /dev/nulles algo más robusto ya que siempre bloqueará el archivo y evitará esperar la entrada en terminales interactivos.
Caleb

1
@Caleb: Como dije, en cualquier shell compatible con POSIX . :-) Ninguna de esas dos situaciones son POSIX-queja.
Chris Down

28

Si su cursor está en la primera línea (si no, escriba: ggo 1G), entonces puede usarlo dG. 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?


3
+1 por ser más ergonómico que: 1, $ d. No es que nuestros dedos no estén conectados para escribir dos puntos todo el tiempo ahora, de todos modos;)
Aaron R.

2
Votado. dGes lo que siempre uso.
lunchmeat317

1
Encuentro este ( ggdG) el método más fácil en vim. La razón por la que esta respuesta no se vota como otras es porque ggno existe en vi puro.
thameera

27

Soy un tipo perezoso y me gusta que sea sencillo. ggdGson cinco pulsaciones de teclas incluidasShift

ggva a la primera línea del archivo, des el comienzo del dverbo elete y Ges el movimiento para ir al final del archivo. Verbosely, es ir al principio del archivo y eliminar todo hasta el final del mosaico.


rsrs. Soy perezoso y uso :$do :1,$des la forma más rápida (escribo menos caracteres) kkk
Frío

3
:%des una buena alternativa, ya que solo usas 5 teclas de esa manera también.
TankorSmash

1
@TankorSmash gges un vimcomando, no vi.
kyrias

buena captura, mi error
TankorSmash


5

Yo siempre uso ggVG

  • gg salta al inicio del archivo de edición actual
  • V(v en mayúscula) seleccionará la línea actual. En este caso, la primera línea del archivo de edición actual
  • G(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 do xpara eliminar todas las líneas.


Si lo usa dverticalmente, se aplica automáticamente en línea. dlelimina un carácter a la derecha, djelimina una línea hacia abajo, por ejemplo.
TankorSmash

3

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 actual

Lo sugerido :1,$dtambién es bueno, por supuesto, y mientras estoy en eso también hay1GdG


:!:>%También es peligroso ya vique 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("%")))
Stéphane Chazelas

3

Otra solución:

truncate -s 0 file

No es realmente más simple que, >filepero está bien.
phk

1
Parece ser un buen método, pero el objetivo lo está haciendo usando vi. Tks
Frío


-1

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.


1
Debe incluir la explicación de lo que hace el comando / cómo funciona (elimina las siguientes 1000 líneas, lo que no elimina todas las líneas si el cursor no está en la primera línea).
sebasth el

es por eso que lo llamé un truco :)
Radu

-1

Escribo ggpara llegar a la parte superior de las líneas y luego hago un 100 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.


-1
> file.txt

Ni siquiera tiene que abrir vi a menos que realmente quiera.


1
Hola y bienvenido al sitio de intercambio de U&L stack. Revise el centro de ayuda para obtener información sobre cómo publicar mejor este sitio. Queremos cultivar preguntas y respuestas informativas y únicas en este sitio. Su respuesta es idéntica a otras respuestas y comentarios en esta publicación. Por favor, editar el post para ser una respuesta más único e informativo por favor. ¡Gracias!
kemotep

Además, el punto de la pregunta es ... "usar vi"
Jeff Schaller

Intenté exactamente lo que sugeriste. Llegué bash: > file.txt: command not found.
roaima

@roaima Obtendrá eso si cita la cosa como "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.