Regex игнорирует разрывы строк и «макет страницы» - PullRequest
0 голосов
/ 16 марта 2019

У меня есть ассортимент доступных для поиска файлов PDF, и я часто ищу определенные шаблоны во всех них одновременно, используя команду pdfgrep. Мои знания в области регулярных выражений несколько ограничены, и я не уверен, как обойти разрывы строк и макет страницы.

Например, я хотел бы найти шаблон "ignor.{0,10}layout" в каждом примере ниже:

This is a rather difficult     You see, I would like to ignore
task that I am trying to       page layout and still find the
achieve.                       pattern I am looking for.
This is a rather difficult     This is because I would like to ig-
task that I am trying to       nore page layout and still find the
achieve.                       pattern I am looking for.

В обоих примерах я хотел бы, чтобы первые две строки были сообщены

pdfgrep -n "ignor.{0,10}layout" *

но этого не происходит, потому что:

  • в середине разрыв строки.
  • в первом примере от ignor до layout более 10 символов.
  • во втором примере ignor разрезается пополам.

Существует ли регулярное выражение, которое полностью решило бы эту проблему?

1 Ответ

1 голос
/ 16 марта 2019

pdfgrep не имеет флага -z, который был бы необходим для интерпретации новых строк как нулевых байтов.Вы можете использовать обходной путь с pdftotext, который позволяет преобразовать его в текст и направить его в STDOUT, где вы можете передать обычный вызов grep:

pdftotext SPECIFIC-FILE.pdf - | grep -Pzo "(?s)YOUR\s+QUERY"

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

for pdf in *.pdf; do echo -n "$pdf:"; pdftotext "$pdf" - | grep -Pzo "(?s)YOUR\s+QUERY"; done

Обратите внимание, что если вы хотите сопоставить пробелы, вы почти всегда захотите использовать \s+, что также соответствует символу новой строки, когда -zвключен.См. этот другой ответ для объяснения флагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...