Come eseguire una ricerca su più righe in meno?


18

In less, puoi cercare usando /un modello che contiene un ritorno a capo e una nuova riga? So che il tuo modello può terminare con una linea usando $(da Come posso includere nuove righe in una ricerca in meno? ), Ma ho bisogno che il modello corrisponda al testo che si estende su più righe.

Ci ho provato \n, ma questo cerca solo il npersonaggio.


Hai provato \n+per 1 o più newline?
Brock Hensley il

Quale distribuzione Linux e hai definito la variabile di ambiente "MENO"?
harrymc,

@harrymc Come sarebbe d'aiuto con la ricerca su più righe?
sashoalm,

Raccolta di informazioni.
Harry

2
Questo non è possibile, sulla base di una revisione del codice sorgente per less( search.c:search_range()). L'operazione di ricerca / corrispondenza viene eseguita su una singola riga delimitata da una nuova riga alla volta, pertanto non è possibile eseguire la corrispondenza tra i limiti della riga. Vedere line.c:forw_raw_line()per l'implementazione di "readline" come chiamato da search_range.
Zackse,

Risposte:


7

Non è possibile far corrispondere i limiti di linea, poiché la funzione di ricerca in lessopera su una singola linea delimitata da una nuova riga alla volta. Questo è il caso indipendentemente dall'implementazione di regex di sistema (GNU, POSIX, PCRE, ecc.).

Nota che non sono riuscito a trovare un repository di fonti ufficiale per lo sviluppo della mainline di less, ma ai fini della revisione del codice qui, i collegamenti che seguono provengono dall'albero contrib di FreeBSD.

Vedi search.c: search_range () per l'implementazione dell'operazione di ricerca. Il ciclo al suo interno chiama line.c: forw_raw_line () per recuperare il successivo blocco di contenuti delimitato da newline. Quel blocco viene passato a match.c: match_pattern () dove viene eseguito il modello di ricerca (espressione regolare).

Per abbinare su più righe, dovrai utilizzare uno strumento diverso. Un'opzione è quella di entrare nel tuo editor e utilizzare le sue capacità di ricerca come suggerito da altri. È possibile richiamare l'editor premendo vin less.


2

Non sei sicuro di come farlo less, ma puoi fare lo stesso in vim.

http://vim.wikia.com/wiki/Search_across_multiple_lines

/PATTERN1\\_.\\{-}PATTERN2

L'atomo \\_.trova qualsiasi personaggio inclusa la fine della linea. Le multi \\{-}partite il meno possibile.


1
Questo non risponde alla domanda, tuttavia, poiché si tratta di meno, non di vim. Dovrebbe essere un commento.
sashoalm,

1
@sashoalm È ancora un tentativo di risposta, quindi voterei in basso e andrei avanti. Le persone alla ricerca di una soluzione potrebbero non essere obbligate a utilizzare uno strumento in modo specifico.
slhck,

2

lesssta usando la edsintassi regex e purtroppo non supporta la corrispondenza multilinea.

https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html#ed-regular-expression-syntax

Speravo di trovare anche quello, o almeno di scoprire se questo bit di sintassi fosse usato in less:

RE_DOT_NEWLINE Se questo bit è impostato, l'operatore match-any-character corrisponde a una nuova riga; se questo bit non è impostato, non lo è.

Quindi posso usare il .+modello per abbinare le nuove linee. Ma no, non lo fa.

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.