¿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 dd
no es una buena opción. Puede haber muchas lineas.
1GdG
funcionaría desde cualquier lugar.echo | test.txt
no es un comando válido, a menos quetest.txt
sea un script ejecutable. Supongo que quieres decir en suecho >test.txt
lugar?vi
,>test.txt
es suficiente para truncar a la longitud cero - noecho
es necesario.Respuestas:
En
vi
hacerpara 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íneasd
deberí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
d
significa eliminar las líneas indicadas.Hay una forma más corta (
:%d
) pero nunca me encuentro usándola. Se:1,$d
pueden "adaptar" más fácilmente, por ejemplo,:4,$-2d
dejando 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/null
es un archivo especial de 0 bytesif
es el archivo de entradaof
es el archivo de salidafuente
dd
necesito pesa para cada línea en el archivo.dd
el comando vi (que significa OP) ydd
la utilidad, de la que da un ejemplo. Además,> test.txt
puede no funcionar como se esperaba en shells que no sean bash (por ejemplo, zsh).: >test.txt
que 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
G
representa la última línea Si está en la primera línea (gg
),dG
le 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.gg
es vim específico. Está1G
en vi tradicional.>| test.txt < /dev/null
es 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:
gg
o1G
), 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
%d
en 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
dG
es 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 porquegg
no existe en vi puro.Soy un tipo perezoso y me gusta que sea sencillo.
ggdG
son cinco pulsaciones de teclas incluidasShift
gg
va a la primera línea del archivo,d
es el comienzo deld
verbo elete yG
es el movimiento para ir al final del archivo. Verbosely, es ir al principio del archivo y eliminar todo hasta el final del mosaico.fuente
:$d
o:1,$d
es la forma más rápida (escribo menos caracteres) kkk:%d
es una buena alternativa, ya que solo usas 5 teclas de esa manera también.gg
es unvim
comando, novi
.Vaya al comienzo del archivo y presione dG.
fuente
Yo siempre uso
ggVG
gg
salta 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,G
seleccionaré el texto completo en este archivo.Luego puede simplemente presionar
d
ox
para eliminar todas las líneas.fuente
d
verticalmente, se aplica automáticamente en línea.dl
elimina un carácter a la derecha,dj
elimina una línea hacia abajo, por ejemplo.tenga en cuenta que en su pregunta,
echo > test.txt
crea un archivo con un solo salto de línea, no un archivo vacío.Desde el shell, considere usar
echo -n > test.txt
o: > 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,$d
también es bueno, por supuesto, y mientras estoy en eso también hay1GdG
fuente
:!:>%
También es peligroso yavi
que 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
>file
pero 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
gg
para 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
;-)