2016-11-03 13 views
0

Мне нужно использовать Perl-совместимое регулярное выражение для соответствия нескольким строкам, которые появляются на нескольких строках в файле.PCRE Regex - Как вернуть совпадения с многострочной строкой, ищущей несколько строк в любом порядке

Матчи должны отображаться в любом порядке (server servernameA.company.com, а затем servernameZ.company.com, а затем servernameD.company.com или любая комбинация заказов из трех). Примечание: Все совпадения появятся в начале каждой строки.

В ходе тестирования с grep -P, я даже не был в состоянии произвести матч на простых строковых терминов, которые появляются в любом порядке по новым линиям (даже при использовании /s и /m модификаторов). Я довольно уверен в чтении. Мне нужно утверждение с открытым исходным кодом, но образцы, которые я использовал, не дали мне соответствия даже после анализа каждого бита регулярного выражения, чтобы убедиться, что он имеет отношение к моему сценарию.

Поскольку мне нужно поддержать это в Production, я бы хотел, чтобы простой и относительно прямой интерпретируемый ответ.

Пример ввода

irrelevant_directive = 0 

# Comment 
server servernameA.company.com iburst 

additional_directive = yes 

server servernameZ.company.com iburst 
server servernameD.company.com iburst 

# Additional Comment 
final_directive = true 

Expectation

Регулярное выражение должно соответствовать и вернуть 3 строки, начинающиеся с сервера (которые появляются в любом порядке), если и только если есть идеальный матч для strings'serverA.company.com ',' serverZ.company.com 'и' serverD.company.com ', за которым следует iburst. Все 3 строки должны быть включены.

Наконец, если ответ (или очень похожая форма ответа) может адресовать проверку строк в любом порядке на одном линиях, это было бы очень полезно. Например, если у меня строка с одной строкой: preauth param audit=true silent deny=5 severe=false unlock_time=1000 time=20ms, и я хочу, чтобы условия deny=5 и time=20ms отображались в любом порядке и, если да, совпадали.

Заранее благодарю вас за помощь.

+0

Вы говорите о PCRE или о программе Perl? – simbabque

+0

Спасибо за быстрый ответ и посмотрим на это. PCRE специально.Я буду использовать команду с 'grep -P'. Обновите, когда я добавил новый короткий раздел о ожидаемом выходе регулярного выражения, которое я ранее забыл. –

+0

Тогда, пожалуйста, не связывайтесь с Perl. Я удалю тег. Есть решения для этого с полноценной программой, но делать это в одном регулярном выражении будет непросто. – simbabque

ответ

1

Что касается основного вопроса [для вторичного вопроса см Casimir et Hippolyte answer] (с использованием модификатора x): https://regex101.com/r/mkxcap/5

(?: 
    (?<a>.*serverA\.company\.com\s+iburst.*) 
|(?<z>.*serverZ\.company\.com\s+iburst.*) 
|(?<d>.*serverD\.company\.com\s+iburst.*) 
|[^\n]*(?:\n|$) 
)++ 
(?(a)(?(z)(?(d)(*ACCEPT))))(*SKIP)(*F) 

Спички теперь все в a, z и d группы захвата.

Это не самый эффективный (он идет три раза по каждой линии с обратным трассировкой ...), но основным выносным является регистрация матчей с группами захвата, а затем проверка их определения.

+0

Спасибо, это помогает. Я отметил это как принятый ответ. Цените свое время! –

1

Вам не нужно использовать функции PCRE, вы можете просто написать в ЭРД:

grep -E '.*(\bdeny=5\b.*\btime=20ms\b|\btime=20ms\b.*\bdeny=5\b).*' file 

подход PCRE будет отличаться: (однако вы можете также использовать предыдущий рисунок)

grep -P '^(?=.*\bdeny=5\b).*\btime=20ms\b.*' file 
+0

Привет, Казимир! Это был мой второй вопрос, на который вы ответили. Спасибо, и это полезно, но есть ли у вас подход к решению основной проблемы (многострочный)? Извините, если я сделал вещи более запутанными, чем необходимо. Однолинейное регулярное выражение было бонусом, и я тестирую его сейчас! –

+0

Привет, Казимир, я подтвердил, что ваше решение проблемы с одной строкой работает отлично! Благодарю. Когда вы получите шанс, можете ли вы взглянуть на мой главный вопрос? Извинения за группировку двух в одну - я не буду этого делать в будущем. –

+0

Приобретено как это полезно. bwoebi решил мой основной вопрос. Спасибо за ваше время! –

 Смежные вопросы

  • Нет связанных вопросов^_^