Как мне найти фразу в нескольких строках? Например, давайте напишем фразу «мой ледяной чай», тогда она может быть обернута в текстовые файлы:
as js skdfh dfh djh sf my
ice tea.
grep не будет совпадать, так как между ними есть новая строка. Как мне соответствовать этим? Другой многострочный шаблон будетpattern1_\n_pattern2
Я знаю, что самый простой способ, которым я делаю ATM, это просто grep для одной части, например, лед с флагом -A2 -B2 и затем в этом выходе, например, чай. Но это очень утомительно. Поэтому я заинтересован в том, как бы вы решили это.
Ответы:
Вы можете установить
pcregrep
(доступно в большинстве репозиториев дистрибутивов) - это grep с использованием библиотеки pcre , которая выполняет "Perl-совместимые регулярные выражения". Он имеет параметр командной строки,-M
который позволяет выполнять многострочный поиск - со страницы руководства :Так что вы могли бы сделать
Это
\s
пробел, который будет соответствовать\n
и\r
в многострочном режиме, в дополнение к обычным пробельным символам. Вы также можете напрямую сопоставить символ новой строки, чтобы вы могли сделатьисточник
grep -E
делает PCR шаблонов??
,+
,{
,|
,(
, и)
как их обычный регулярное выражение смысла без необходимости иметь\
впереди, как вы делаете , если вы используете стандартный Grep. Такgrep 'hello\s\+world' file
эквивалентноgrep -E 'hello\s+world' file
. Это не делает PCRE. Существуетgrep -P
для регулярных выражений Perl, но это экспериментальный (согласно man-странице), и я думаю, что это немного отличается от pcregrep ...-P
когда сказал-E
, но я не осознавал, что все было иначе.Я бы , вероятно , сделать поиск , используя
vim
«s:vimgrep
команды. Это работает примерно так же, как и дляgrep
vim RE и путей.По сути, вы запускаете что-то вроде
:vimgrep 'pattern1\npattern2' path/**
рекурсивного поиска, затем:copen
набираете, чтобы вызвать меньшее окно, содержащее список совпадений.vim
RE могут делать в основном все, что могут PCRE, но они развивались отдельно от линии регулярных выражений perl, поэтому большинство продвинутых вещей работает по-другому. Их базовая функциональность больше похожа на базовые RE, но у них есть некоторые изящные дополнения, которые PCRE не предлагают.Я не уверен, можно
:vimgrep
ли выкладывать данные, как этоgrep
делает; Я только пытался использовать его для навигации внутриvim
.:help vimgrep
изнутриvim
для получения дополнительной информации;:help pattern.txt
для получения информации оvim
РЗ; Для получения дополнительной информации о путях см:help wildcards
.источник
.vimrc
? Он должен быть более переносимым, чем вgrep
отношении операционной системы:vim
не имеет «POSIX-аромата» и работает более или менее идентично даже под Windows. .................................................. ............................ Можно добавить квалификаторы, чтобы гарантировать, что, например, правильное количество "магии" используется в RE, хотя насколько я понимаю, существует строгое неписаное правило, чтобы этот вариант оставался в покое.find.exe
вместоgrep
). В течение последних нескольких недель был еще один вопрос, который имел эту проблему.:vimgrep
или:grep
? От:help grep
: «Преимущество внутреннего grep [то есть:vimgrep
] в том, что он работает во всех системах и использует мощные шаблоны поиска Vim».Grep работает только по одной строке за раз, но вы можете использовать awk для печати строк, соответствующих ряду шаблонов:
это будет соответствовать чему угодно, а не только переводу строк между двумя шаблонами
источник
Чтобы получить максимальную отдачу от Unix, вам нужно использовать преимущества труб. Вы можете сделать это обычным способом,
grep
используя трубы (нет необходимости в тройнике):Что я не считаю утомительным.
источник