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

Frío
fuente
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.

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

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

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

Vaya al comienzo del archivo y presione dG.

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

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

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

Tipo :y%d

(No en modo de inserción. Si es así, presione escapar primero)

DimiDak
fuente
Tenga en cuenta que esto ya
Jeff Schaller
-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.

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

Atul
fuente
-1
> file.txt

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

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