Intereting Posts
сопоставлять файлы на основе md5, используя find Uboot передает аргументы в ядро! Как другие процессы влияют на измерения, выполненные с помощью «времени»? Извлечь начальные и конечные координаты в соответствии с определенной длиной нефиксированного интервала Невозможно использовать aa-genprof без патча совместимости Где «logger» регистрирует свои сообщения в Arch Linux? Есть ли истина в философии, которую вы должны синхронизировать; синхронизации; синхронизации; синхронизировать? Замените точки с запятой запятыми между котировками только awk системный вызов с инвертированным эффектом Почему Debian не предоставляет i586 и i686 в качестве отдельных архитектур? Что такое sourcing мой сценарий оболочки? Как отключить переключение виртуальных консолей Alt-Arrow? Можно ли настроить rsync, чтобы не изменять подкаталоги, не найденные в исходной папке? Получение патчей из списка рассылки с mutt и vim Libvirt управляемое хранилище объемное шифрование тома в «логическом» пуле хранения

Поиск файла для строки, окруженной двумя другими известными строками?

Заголовок вопроса может быть немного неопределенным, но это то, что я пытаюсь сделать.

У меня есть файл html локально на моем сервере, который меняется довольно регулярно. Он имеет несколько случаев:

<p>Jumble of random text</p> <p>More text</p> 

И так далее…

Я хочу, чтобы иметь возможность сортировать все различные беспорядки случайного текста, пока он не найдет тот, который я ищу, например «случайный», который может быть где угодно в файле. Затем я хочу, чтобы переменная, назначенная

 Jumble of random text 

Все между:

 <p> and </p> 

Пока у меня это:

 echo grep -i 'random' search.html | grep -o -P '(?<=<p>).*(?=</p>)' search.html 

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

 Jumble of random text More text 

Как я могу заставить его просто вернуться:

 Jumble of random text 

Очень смутно, очень быстро.

Это связано с тем, что шаблон соответствия .* – это то, что известно как жадное соответствие , что означает, что оно вернет самую большую строку, соответствующую вашему шаблону поиска.

То, что вы хотели бы сделать, – использовать не-жадное (или ленивое ) соответствие, которое возвращает кратчайшую строку, соответствующую вашему шаблону. Вы можете сделать это, изменив ваш жадный матч от .* До .*? , Однако grep обычно не поддерживает это по умолчанию, но вы можете включить его, используя параметр -P который позволяет сопоставлять регулярные выражения perl.

Короче говоря, вы можете изменить команду grep на grep -o -P '(?<=<p>).*?(?=</p>)' .

Более подробную информацию об этом ответе можно найти на странице https://stackoverflow.com/questions/3027518/non-greedy-grep