1 Вопрос: Regex игнорирует разрывы строк и «макет страницы»

вопрос создан в Sat, Mar 16, 2019 12:00 AM

У меня есть ассортимент доступных для поиска файлов 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 разрезается пополам.

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

    
0
  1. Линии на левой стороне определенно являются частью моей проблемы, если это был ваш вопрос.
    2019-03-16 19: 16: 24Z
1 ответ                              1                         

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. См. этот другой ответ для пояснения флагов.

    
1
2019-03-16 19: 26: 11Z
  1. -z переведет "word1\nword2" в "word1word2" вместо "word1 word2", не так ли? Также я считаю, что это решение не находит ignor во втором примере?
    2019-03-16 19: 41: 56Z
  2. Я думаю, что это почти то, что мне нужно, хотя я пытаюсь работать над тем, что вы отправили. Все, что мне нужно, это заменить все - ничем, а все переносы строк - пробелами. И, возможно, покажет немного больше, чем просто шаблон, потому что файл .txt имеет только 1 строку, поэтому единственный способ найти шаблон - это узнать символы до и после.
    2019-03-16 19: 56: 27Z
  3. for pdf in *.pdf; do echo -n "$pdf:"; pdftotext "$pdf" - | sed -z 's/-//g;s/\n//g' | grep -Po ".{0,20}ignor.{0,10}layout.{0,20}"; echo ""; done решил мою проблему, большое спасибо!
    2019-03-16 20: 43: 33Z
источник размещен Вот