Jak wyszukiwać wieloliniowo w mniej?

18

W less, można wyszukiwać za pomocą /na wzór, który zawiera znak powrotu karetki i nowego wiersza? Wiem, że twój wzór może kończyć się linią używającą $(od Jak włączyć nowe wiersze w wyszukiwaniu w mniej? ), Ale potrzebuję wzoru, aby dopasować tekst, który obejmuje wiele linii.

Próbowałem \n, ale to tylko szuka npostaci.

Yonran
źródło
Czy próbowałeś już \n+1 lub więcej nowych linii?
Brock Hensley,
Która dystrybucja systemu Linux i czy zdefiniowałeś zmienną środowiskową „LESS”?
harrymc
@harrymc W jaki sposób pomogłoby to w wyszukiwaniu wieloliniowym?
sashoalm
Zbieranie informacji.
harrymc
2
Nie jest to możliwe, na podstawie przeglądu kodu źródłowego dla less( search.c:search_range()). Operacja wyszukiwania / dopasowania jest wykonywana na pojedynczej linii rozdzielanej znakiem nowej linii na raz, więc nie można dopasować między granicami linii. Zobacz line.c:forw_raw_line()implementację „readline” jak wywoływany przez search_range.
zackse

Odpowiedzi:

7

Nie można dopasowywać między granicami linii, ponieważ funkcja wyszukiwania lessdziała na pojedynczej linii oddzielonej nową linią. Dzieje się tak niezależnie od implementacji wyrażenia regularnego systemu (GNU, POSIX, PCRE itp.).

Zauważ, że nie mogłem znaleźć oficjalnego repozytorium źródłowego dla głównego rozwoju less, ale dla celów przeglądu kodu poniższe linki pochodzą z drzewa contrib FreeBSD.

Zobacz search.c: search_range (), aby zapoznać się z implementacją operacji wyszukiwania. Pętla w nim wywołuje line.c: forw_raw_line (), aby pobrać następny blok treści rozdzielany znakiem nowej linii. Ten blok jest przekazywany do match.c: match_pattern (), w którym wykonywany jest wzorzec wyszukiwania (wyrażenie regularne).

Aby dopasować do wielu wierszy, musisz użyć innego narzędzia. Jedną z opcji jest wpadnięcie do edytora i korzystanie z jego możliwości wyszukiwania, jak sugerują inni. Można wywołać edytor naciskając vw less.

zackse
źródło
2

Nie wiesz, jak to zrobić less, ale możesz to zrobić w vim.

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

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

Atom \\_.znajduje dowolny znak, w tym koniec linii. Wiele \\{-}dopasowań jest jak najmniej.

Vam
źródło
1
To jednak nie odpowiada na pytanie, ponieważ chodzi o mniej, a nie vim. To powinien być komentarz.
sashoalm
1
@sashoalm To wciąż próba odpowiedzi, więc zagłosuję w dół i przejdę dalej. Osoby szukające rozwiązania mogą nie być zobowiązane do korzystania z jednego narzędzia.
slhck
2

lessużywa edskładni wyrażeń regularnych i nie obsługuje niestety dopasowywania wieloliniowego.

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

Miałem również nadzieję to znaleźć, a przynajmniej dowiedzieć się, czy ten bit składniowy został użyty w less:

RE_DOT_NEWLINE Jeśli ten bit jest ustawiony, to operator dopasowania dowolnego znaku dopasowuje nową linię; jeśli ten bit nie jest ustawiony, to nie jest.

Więc mogę użyć .+wzorca, aby dopasować nowe linie. Ale nie, nie ma.

stymulacja
źródło