Come farlo in Vim:
PRIMA:
aaa
bbb
ccc
ddd
eee
fff
DOPO:
aaa
ccc
eee
Come farlo in Vim:
PRIMA:
aaa
bbb
ccc
ddd
eee
fff
DOPO:
aaa
ccc
eee
Risposte:
Puoi usare una macro per questo. Eseguire le seguenti operazioni.
gg.qq.dddopo.q.10000@qPS: per passare alla modalità di comando basta premere Esc un paio di volte.
:g/^/+ddall'utente stackoverflow.com/users/254635/ib (sotto) è un modo più elegante per risolvere questo problema.
Un modo elegante (ed efficiente) per eseguire l'attività è invocare il :+deletecomando rimuovendo la riga successiva a quella corrente, su ogni riga utilizzando il :globalcomando:
:g/^/+d
:1d|g/^/+dcancella le righe dispari.
Possiamo usare :normalo :normper eseguire dati comandi in modalità normale. Fonte.
:%norm jdd
%norm ddjnon funziona se vuoi eliminare le righe dispari.
:map ^o ddj^o
^o
Qui ^ sta per CTRL. Macro ricorsiva per eliminare una riga ogni due righe. Scegli bene la tua prima riga e il gioco è fatto.
dall'archivio di posta di vim :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(Per essere digitato su una riga nella riga di comando di vim, cancellerà la riga 1,3,5,7, ...)
!perl -ne 'print unless $. % 2':-)
if (expression)cui funziona anche per ogni terza linea ecc.
Puoi sempre eseguire il pipe tramite un comando shell, il che significa che puoi utilizzare qualsiasi linguaggio di scripting che ti piace:
:%!perl -nle 'print if $. % 2'
(o usa "a meno che" invece di "se", a seconda delle linee che vuoi)
-lpassaggio a Perl ... inoltre, direi che awkè un po 'più diffuso di Perl, anche se non è molto di più in questi giorni, e può farlo più breve:, :%!awk NR\%2o :%!awk 1-NR\%2per le altre righe.
:%!awk -- '++c\%2'
in alternativa
:%!awk -- 'c++\%2'
a seconda di quale metà vuoi estirpare.
NRvariabile esistente ?
:%!awk NR\%2oppure :%!awk 1-NR\%2, come ho postato in un altro commento. Non è quasi più lungo.
1-NRè più lungo di c++. Sì, lo so che è un personaggio. Come ho detto, il vero motivo è che me ne sono dimenticato. Ad ogni modo, sembra che le persone non apprezzino la bellezza di awk qui.
NRè più breve di ++c:)
Puoi usare le capacità di ricerca e sostituzione di Vim in questo modo: Posiziona il cursore sulla prima riga e digita in modalità normale:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/è l'intervallo per la sostituzione. Significa "da questa riga alla riga che corrisponde alla regex fff(in questo caso, l'ultima riga).s///è il comando sostitutivo. Cerca una regex e ne sostituisce ogni occorrenza con una stringa. Alla gfine significa ripetere la sostituzione finché la regex continua a essere trovata.\n.*\(\n.*\)corrisponde a una nuova riga, quindi a un'intera riga ( .*corrisponde a un numero qualsiasi di caratteri eccetto una nuova riga), quindi un'altra nuova riga e un'altra riga. Le parentesi \(e fanno \)sì che l'espressione al loro interno venga registrata, quindi possiamo usarla in seguito usando \1.\1 inserisce la nuova riga raggruppata e la riga dopo di essa, perché non vogliamo che anche la riga successiva vada via - vogliamo solo che il meccanismo di sostituzione passi oltre in modo da non eliminarla nella sostituzione successiva.In questo modo puoi controllare l'intervallo in cui desideri che venga eseguita l'eliminazione e non devi utilizzare alcuno strumento esterno.
$invece di /fff/, per la fine del file indipendentemente dal contenuto del file.
Come altro approccio potresti anche usare python se il tuo vim ha il supporto per esso.
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]copia temporaneamente tutte le righe nel buffer corrente in b. b[::2]ottiene ogni seconda riga dal buffer e la assegna all'intero buffer corrente cb[:]. La copia in bè necessaria poiché gli oggetti buffer non sembrano supportare la sintassi della sezione estesa.
Questo probabilmente non è il "modo vim", ma potrebbe essere più facile da ricordare se conosci python.
Per eliminare le righe dispari (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
Per eliminare le righe pari (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
Cerca testo (forma la prima riga) seguito da un nuovo carattere di riga e altro testo (forma la seconda riga) seguito da un altro nuovo carattere di riga e sostituisci quanto sopra con la prima corrispondenza (riga dispari) o la seconda corrispondenza (riga pari) seguito da ritorno a capo.
puoi provarlo in vim
:1,$-1g/^/+1d
Cercherò di essere più chiaro (due parti)
prima parte l'intervallo di selezione ( :from,to)
seconda parte l'azione ( delimina)
:1,$-1 )g) delete ( +1d) riga successivapuoi provare a spostarti sulla prima riga del tuo file ed eseguirlo :+1dvedrai scomparire la riga successiva
So che è fangoso, ma è vivo e funziona