Wie mache ich eine mehrzeilige Suche in weniger?


18

In lesskönnen Sie mit Suche /nach einem Muster , das einen Wagenrücklauf und Newline enthält? Ich weiß, dass Ihr Muster mit einer Zeile enden kann $(von Wie füge ich in weniger Zeilen neue Zeilen in eine Suche ein? ), Aber ich benötige das Muster, um mit Text übereinzustimmen , der sich über mehrere Zeilen erstreckt.

Ich habe es versucht \n, aber das sucht nur nach dem nCharakter.


Haben Sie \n+1 oder mehr Zeilenwechsel versucht ?
Brock Hensley

Welche Linux-Distribution und haben Sie die Umgebungsvariable "WENIGER" definiert?
Harrymc

@harrymc Wie würde das bei der mehrzeiligen Suche helfen?
Sashoalm

Informationen sammeln.
Harrymc

2
Dies ist aufgrund einer Überprüfung des Quellcodes für less( search.c:search_range()) nicht möglich . Die Such- / Übereinstimmungsoperation wird jeweils für eine einzelne durch neue Zeilen getrennte Zeile ausgeführt, sodass keine Übereinstimmung über Zeilengrenzen hinweg möglich ist. Siehe line.c:forw_raw_line()für die Implementierung von "readline", wie von aufgerufen search_range.
Zackse

Antworten:


7

Es ist nicht möglich, Übereinstimmungen über lessZeilengrenzen hinweg zu suchen, da die Suchfunktion jeweils nur für eine durch neue Zeilen getrennte Zeile ausgeführt wird. Dies ist unabhängig von der Regex-Implementierung des Systems (GNU, POSIX, PCRE usw.) der Fall.

Bitte beachten Sie, dass ich kein offizielles Quellcode-Repository für die Hauptentwicklung von gefunden habe less. Zum Zwecke der Codeüberprüfung stammen die folgenden Links jedoch aus dem FreeBSD-Beitragsbaum.

Siehe search.c: search_range () für die Implementierung der Suchoperation. Die Schleife darin ruft line.c: forw_raw_line () auf, um den nächsten durch neue Zeilen getrennten Inhaltsblock abzurufen. Dieser Block wird an match.c: match_pattern () übergeben, wo das Suchmuster (regulärer Ausdruck) ausgeführt wird.

Um eine Übereinstimmung über mehrere Zeilen hinweg zu erzielen, müssen Sie ein anderes Tool verwenden. Eine Möglichkeit besteht darin, in Ihren Editor zu wechseln und die von anderen vorgeschlagenen Suchfunktionen zu verwenden. Sie können durch Drücken der Editor aufrufen vin less.


2

Ich bin mir nicht sicher, wie ich es anstellen soll less, aber Sie können das Gleiche auch anstellen vim.

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

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

Das Atom \\_.findet jedes Zeichen einschließlich des Zeilenendes. Das Multi \\{-}entspricht so wenig wie möglich.


1
Dies beantwortet die Frage jedoch nicht, da es um weniger geht, nicht um vim. Es sollte ein Kommentar sein.
Sashoalm

1
@sashoalm Es ist immer noch ein Versuch zu antworten, also würde ich es ablehnen und weitermachen. Personen, die nach einer Lösung suchen, sind möglicherweise nicht verpflichtet, ein bestimmtes Tool zu verwenden.
Slhck

2

lessverwendet die edRegex-Syntax und unterstützt leider keinen mehrzeiligen Abgleich.

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

Ich hatte gehofft, das auch zu finden, oder zumindest herauszufinden, ob dieses Syntaxbit verwendet wurde in less:

RE_DOT_NEWLINE Wenn dieses Bit gesetzt ist, stimmt der Operator für die Übereinstimmung eines beliebigen Zeichens mit einer neuen Zeile überein. Wenn dieses Bit nicht gesetzt ist, dann nicht.

So kann ich .+Muster verwenden, um Zeilenumbrüche abzugleichen. Aber nein, das tut es nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.