Как искать текст в файле, игнорируя новые строки?

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

например, я бы искал is an example file и ожидал, что он будет найден в следующем файле:

Это

пример файла.

Чтобы не зависеть от ведущих или конечных пробелов, было бы лучше всего игнорировать все формы белого пространства (в идеале, обрабатывать любую последовательность белого пространства как одно пространство).


Одно неидеальное решение – tr '\n' ' ' | grep tr '\n' ' ' | grep , который различает совпадения и не совпадения, но не показывает совпадения и не имеет большого отношения к большим файлам.

  • Как разбирать файл с конца в awk
  • Как найти пакет Fedora, обеспечивающий необходимую мне зависимость?
  • grep, как подавить отображение несогласованного файла?
  • Поиск значений в 2 столбцах из CSV
  • Emacs: запрос-замена, регулярное выражение, повторное использование результата поиска
  • Количество строк с определенным значением в столбце для всех файлов в каталоге рекурсивно
  • Поиск файла на основе диапазона данных
  • Как получить количество ссылок на файлы в папке с этими ссылками?
  • 2 Solutions collect form web for “Как искать текст в файле, игнорируя новые строки?”

    GNU grep может это сделать

     grep -z 'is\san\sexample\sfile.' file 

    Чтобы выполнить некоторые моменты, возникающие в комментариях, есть некоторые модификации сценария:

      grep -oz '^[^\n]*\bis\s*an\s*example\s*file\.[^\n]*' file 

    Что касается огромных файлов, у меня нет воображения ограничения памяти, но в случае проблемы вы можете использовать sed

     sed '/\bis\b/{ :1 N /file\.\|\(\n.*\)\{3\}/!b1 } /\<is\s*an\s*example\s*file\./p D' file 

    которые сохраняют не более 4 строк (из-за 4 слов в шаблоне) в памяти ( \(\n.*\)\{3\} ).

    Попробуй это:

     pcregrep -M '\bThis\s+is\b' <<EOT This is an example file. EOT 
    Linux и Unix - лучшая ОС в мире.