Editor Vi: Qual é a maneira mais rápida de excluir várias linhas em um arquivo?

12

Eu gostaria de usar o editor Vi para excluir várias linhas em um arquivo. Por favor me dê uma ideia ou sugestão.

Meu objetivo é assim:

Antes:

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

Depois de;

1
10
20
30
40
.
.
rangsiman
fonte
3
como você escolheu as linhas para excluir? Você quer deixar uma linha a cada 10?
matzeri
1
Você pode excluir intervalos de linhas, :[range]dpor exemplo, :3,5dexclui as linhas de três a cinco (inclusive).
Bratchley
6
Há também vi.stackexchange .
Alexey
@R Ketkaew - Você está tentando remover uma lista de números ou são linhas? Você poderia atualizar sua pergunta para esclarecer?
DarkHeart 16/07/2016
Eu sei que você está perguntando sobre o Vi, mas você também pode fazer com o GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Respostas:

17

Se você quer manter 10 linhas e excluir o restante:

%norm 9ddj

Explicação:

% arquivo inteiro

norm execute os seguintes comandos no "modo normal"

9dd excluir 9 linhas

j desça uma linha (ou seja, mantenha-a)

nota: isso exclui a primeira linha.

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


Ou usando o comando global:

  • Duplique a primeira linha ggYP
  • :g/^/+ d9

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


Ou você pode usar awk:

%!awk 'NR \% 10 == 0 || NR == 1'
DarkHeart
fonte
O comando awk funciona para mim. Eu sempre pensei que o awk exigia no mínimo um bloco {...}. É bom saber que você não. É o primeiro comando não trivial do awk que eu estou trabalhando!
the_velour_fog
1
@the_velour_fog o bloco é obrigatório. se você não escrever um, AWK se comportará como se você tivesse escrito{ print $0 }
shadowtalker
@RKetkaew Qual das opções você usou? Se uma resposta resolver sua pergunta, clique no visto para marcar como resposta.
underscore_d
@underscore_d Olá, usei um comando sugerido pelo DarkHeart. Obrigado por seus comentários.
rangsiman
12
:2,$v/0$/d

exclui as linhas que não terminam 0a partir da segunda.

Stéphane Chazelas
fonte
2
Essa é a solução inteligente. Eu apenas adicionaria uma explicação que 2,$é o intervalo e v/0$/do g!comando. Onde 0$está o regex e do comando ex que serão executados em todas as linhas que não correspondem.
18716 grochmal