Как сделать многострочный поиск меньше?


18

В less, вы можете найти с /помощью шаблона, который содержит возврат каретки и перевод строки? Я знаю, что ваш шаблон может заканчиваться строкой с помощью $(из Как включить новые строки в поиск за меньшее время? ), Но мне нужен шаблон, чтобы соответствовать тексту, который занимает несколько строк.

Я пытался \n, но это только поиск nперсонажа.


Вы пробовали \n+на 1 или более новых строк?
Брок Хенсли

В каком дистрибутиве Linux вы определили переменную среды "LESS"?
harrymc

@harrymc Как это поможет с многострочным поиском?
sashoalm

Собирая информацию.
harrymc

2
Это невозможно, основываясь на обзоре исходного кода для less( search.c:search_range()). Операция поиска / сопоставления выполняется по одной строке с разделителями новой строки за раз, поэтому вы не можете найти соответствие между границами строк. Смотрите line.c:forw_raw_line()для реализации "readline", как вызвано search_range.
Заксе

Ответы:


7

Невозможно найти соответствие между границами строк, потому что функция поиска lessработает по одной строке, разделенной новой строкой, за раз. Это имеет место независимо от реализации системного регулярного выражения (GNU, POSIX, PCRE и т. Д.).

Обратите внимание, что я не смог найти официальный исходный репозиторий для основной разработки less, но для целей обзора кода здесь ссылки, которые следуют, взяты из дерева ресурсов FreeBSD.

Смотрите search.c: search_range () для реализации операции поиска. Цикл в нем вызывает line.c: forw_raw_line () для получения следующего блока содержимого, разделенного новой строкой . Этот блок передается в match.c: match_pattern (), где выполняется шаблон поиска (регулярное выражение).

Чтобы сопоставить несколько строк, вам нужно использовать другой инструмент. Один из вариантов - зайти в ваш редактор и использовать его возможности поиска, как предлагают другие. Вы можете вызвать редактор, нажав vна less.


2

Не уверен, как это сделать less, но вы можете сделать то же самое в vim.

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

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

Атом \\_.находит любой символ, включая конец строки. Мульти \\{-}соответствует как можно меньше.


1
Это не отвечает на вопрос, однако, так как речь идет о меньше, а не vim. Это должен быть комментарий.
sashoalm

1
@sashoalm Это все еще попытка ответить, поэтому я бы проголосовал и продолжил. Люди, которые ищут решение, могут не обязательно использовать один инструмент.
slhck

2

lessиспользует edсинтаксис регулярных выражений и, к сожалению, не поддерживает многострочное сопоставление.

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

Я также надеялся найти это или, по крайней мере, найти, использовался ли этот синтаксический бит в less:

RE_DOT_NEWLINE Если этот бит установлен, то оператор совпадения с любым символом соответствует новой строке; если этот бит не установлен, то это не так.

Так что я могу использовать .+шаблон, чтобы соответствовать новые строки. Но нет, это не так.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.