Vi editor: ¿Cuál es la forma más rápida de eliminar varias filas en un archivo?

12

Me gustaría usar el editor Vi para eliminar varias filas en un archivo. Por favor, dame una idea o sugerencia.

Mi objetivo es así:

Antes de:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

Después;

1
10
20
30
40
.
.
Rangsiman
fuente
3
¿Cómo eliges las filas para eliminar? ¿Quieres dejar una fila cada 10?
matzeri
1
Puede eliminar rangos de líneas con, :[range]dpor ejemplo, :3,5delimina las líneas tres a cinco (inclusive).
Bratchley
66
También hay vi.stackexchange .
Alexey
@R Ketkaew - ¿Estás tratando de eliminar una lista de números o son filas? ¿Podría actualizar su pregunta para aclararla?
DarkHeart
Sé que estás preguntando por Vi, pero también puedes hacerlo con GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Respuestas:

17

Si quiere decir que desea conservar cada décima línea y eliminar el resto:

%norm 9ddj

Explicación:

% archivo completo

norm ejecutar los siguientes comandos en "modo normal"

9dd eliminar 9 líneas

j moverse hacia abajo una línea (es decir, mantenerla)

nota: esto elimina la primera fila.

Adaptado de http://www.rayninfo.co.uk/vimtips.html


O usando el comando global:

  • Duplicar la primera línea. ggYP
  • :g/^/+ d9

Adaptado de /programming/1946738/vim-how-to-delete-every-second-row


O podrías usar awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Corazón oscuro
fuente
El comando awk funciona para mí. Siempre pensé que awk requería un mínimo de un bloque {...}. Es bueno saber que no. ¡Es el primer comando awk no trivial que tengo funcionando!
the_velour_fog
1
@the_velour_fog se requiere el bloque . si no escribe uno, AWK se comportará como si hubiera escrito{ print $0 }
shadowtalker
@RKetkaew ¿Cuál de las opciones usaste? Si una respuesta resuelve su pregunta, haga clic en la marca para marcarla como la respuesta.
underscore_d
@underscore_d Hola, utilicé un comando sugerido de DarkHeart. Gracias por tus comentarios.
rangsiman
12
:2,$v/0$/d

elimina las líneas que no terminan 0comenzando desde la segunda.

Stéphane Chazelas
fuente
2
Esta, esta es la solución inteligente. Simplemente agregaría una explicación que 2,$es el rango y v/0$/del g!comando. ¿Dónde 0$está la expresión regular y del comando ex que se ejecutará en todas las líneas que no coinciden?
grochmal