Unisci le linee tra un certo modello di testo in Vim


8

Ho un file di testo che assomiglia a questo:

A.
text
text
text


A.
more text

more text

A.
more text

Voglio unire tutte le linee tra i "marcatori" in A.modo che appaia:

A.texttexttext
A.more textmore text
A.more text

Come posso farlo in Vim?

Risposte:


4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Sostituisci una corrispondenza del modello:

  1. nuova linea,
  2. un gruppo contenente di

    1. non la stringa A.seguita direttamente da end-of-line, quindi
    2. qualsiasi personaggio fino alla fine della linea

con:

  • tutto corrisponde tranne la nuova riga iniziale (ovvero il gruppo sopra),

e farlo a livello globale.


1
Grazie. Non ho idea di come funzioni quella cosa, ma sembra! Dovrò analizzarlo attentamente. Ho anche trovato un modo per aggirare unendo tutte le linee e quindi inserendo una nuova linea in "A."
vim noob,

@vimnoob: vedi :help \@!in Vim per maggiori informazioni su quella parte. Altrimenti è semplice, si spera, con la mia spiegazione. Un problema con il tuo approccio è che se " A." si verifica nel testo, sebbene non come una linea di marcatura isolata, verrà diviso come se fosse originariamente un marcatore. In pratica, potrebbe non essere un problema (non so come sia il tuo file "reale"), ma in genere può causare comportamenti indesiderati se uno non ne è consapevole.
Daniel Andersson,

@vimnoob: ho letto di nuovo la mia risposta, e nel caso in cui tu non abbia familiarità con la :%s///sintassi: è una sintassi "cerca e sostituisci" in Vim. :avvia il comando, %specifica l'intero buffer come intervallo, savvia una sostituzione. /è il delimitatore di pattern (è possibile utilizzare qualsiasi altro carattere, ma /è "standard"). Il primo /avvia il modello di ricerca, il secondo il modello di sostituzione e il terzo lo termina. Sono disponibili modificatori finali per specificare l'insensibilità ai casi, ecc. \1Rappresenta il gruppo acquisito nel modello di ricerca. :%s/foo/bar/sostituisce foocon barnel file.
Daniel Andersson,

Grazie mille per il vostro aiuto. Devo solo cercare questo \ @! parte come ho familiarità con la ricerca di base di sostituzione e regexp di base.
vim noob,

1
@Reman: il modo più diretto a cui penso immediatamente è quello di eseguire una successiva partita di tipo globale simile :%s/^A\.//. Il metodo nella risposta non cattura gli ^A\.schemi stessi (piuttosto la loro assenza), quindi non può modificare quelle stringhe in modo ovvio.
Daniel Andersson,

7

Questo funziona anche (quando inizia la prima riga A.)

:v/^A/-1j!

Funziona! Bello. +1
ZaSter,

Sì, in verità, e due trucchi nuovi per me, dopo il match globale anti-pattern (v): la "j" per unirsi e il "!" per unirsi senza aggiungere uno spazio. Grazie.
Fortboise,

@Miro Eeeek !!! ti saluto signore. se potessi spiegare perché funziona allora super! .. anche io ho dovuto concatenare le linee con il carattere di tabulazione tra ... quindi quello che ho fatto è stato aggiungere come / $ / \ t / g carattere di tab alla fine di ogni riga prima di emettere sopra comando .. qualsiasi modo migliore
ihightower
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.