Выражение регулярного выражения для выбора пары строк
У меня есть лог-файл. Общий формат
log text 1 <br/>
log text 2 <br/>
Error: xxxxxx <br/>
error description (1 line only) <br/>
log text 3 <br/>
log text 4 <br/>
.... <br/>
Error: xxxxxx <br/>
error description (1 line only) <br/>
log text 5 <br/>
.... <br/>
Я хотел бы выбрать и извлечь пару из 2 строк, содержащих ошибки (каждая ошибка имеет две строки. В первой строке всегда есть ошибка: как ключевое слово. Ошибка слова не встречается больше нигде в лог-файле).
Как мне сделать это с помощью регулярных выражений или любым другим способом. Я могу использовать MacOS, Unix или Windows XP. MacOS предпочтительнее.
2 ответа
Использование grep на ОС Mac или Unix
grep -i error -A2 inputfile
Например, регулярное выражение для поиска этих двух строк:
^.*?Error.*(?:\r?\n|\r).*$
^
... начать каждый поиск в начале строки.
.*?
... соответствует любому символу, кроме возврата каретки и перевода строки ноль или более раз без жадности. Не жадность означает как можно меньше символов. Другими словами, остановитесь на первом появлении Error
и не в последний раз.
Error
... это слово должно быть найдено в первой из 2 строк, чтобы соответствовать.
.*
... соответствует любому символу, кроме возврата каретки и перевода строки ноль или более раз по жадности. Жадность означает, что теперь соответствует столько персонажей, сколько возможно.
(?:\r?\n|\r)
... - это группа без пометки, соответствующая либо возврату каретки + перевод строки (текстовые файлы DOS/Windows), либо только перевод строки (текстовые файлы UNIX), либо только возврат каретки (старый текстовый файл MAC).
.*
... соответствует любому символу, кроме возврата каретки и перевода строки 0 или более раз жадным образом.
$
... якорь для конца строки. Окончание строки не входит в согласованную строку.
Другими словами, это выражение соответствует всей строке, содержащей где-либо слово Error
, разделитель строки в этой первой строке и все элементы на следующей строке до конца строки, но не совпадающие также с разделителем строки этой второй строки.
UltraEdit - это условно-бесплатный текстовый редактор, доступный для Windows, Linux и Mac.
Использование этого регулярного выражения Perl в диалоге поиска - поиска UltraEdit с опцией расширенного поиска Список строк, содержащий включенные строки, приводит к получению всех найденных двухстрочных строк, записанных в окно со списком всех найденных строк.
Открытие контекстного меню этого окна (щелчок правой кнопкой мыши по Windows) и нажатие кнопки " Копировать в буфер обмена" приводит к копированию всех найденных строк в системный буфер обмена.
Нажатие Ctrl+N, чтобы открыть новый файл, Ctrl+V, чтобы вставить скопированные строки, и Ctrl+S, чтобы сохранить новый файл, и, наконец, получить файл с нужной информацией.
Другой метод - использование сценария UltraEdit FindStringsToNewFile с сокращенной строкой поиска регулярного выражения. Error.*(?:\r?\n|\r).*
, Этот скрипт записывает все найденные строки, начиная с ключевого слова Error
и заканчивается в конце следующей строки непосредственно в новый файл.
Еще одна заметка:
Если .
(точка) соответствует также символам новой строки, таким как возврат каретки и перевод строки зависит от флага. В UltraEdit по умолчанию установлен флаг, что точка не соответствует символам новой строки. С (?s)
в начале строки поиска регулярного выражения Perl флаг изменяется, и точка затем будет соответствовать символам новой строки для этого поиска. С (?-s)
в начале строки поиска флаг может быть установлен для несоответствия символов новой строки точкой, если внутреннее значение по умолчанию для приложения противоположное.