Я хотел бы найти текст, который может быть разбит на несколько строк в файле. Grep, который игнорировал бы разрывы строк и возвращал соответствующий диапазон строк.
например, я буду искать is an example file
и ожидать, что он будет найден в следующем файле:
Это пример файл.
Чтобы не зависеть от начальных или конечных пробелов, лучше всего полностью игнорировать все формы пробелов (в идеале, любая последовательность пробелов рассматривается как единый пробел).
Одно неидеальное решение состоит в том tr '\n' ' ' | grep
, что различает совпадения и несоответствия, но не показывает совпадения и не работает с большими файлами.
text-processing
grep
search
newlines
Никана Рекламикс
источник
источник
isearch-forward
)/This\_sis
. Для получения более подробной информации::help \_s
.Ответы:
GNU
grep
может это сделатьДля выполнения некоторых пунктов, которые возникают в комментариях, есть некоторые модификации скрипта:
Что касается огромных файлов, я не имею представления об ограничении памяти, но в случае проблем вы можете свободно использовать
sed
которые хранят в памяти не более 4 строк (потому что в шаблоне 4 слова
\(\n.*\)\{3\}
).источник
-z
опция говорит, чтоgrep
нужно рассматривать новые строки как обычные текстовые символы и искать нулевые байты в отдельных записях. В текстовом файле без нулевых байтов (т.е. в типичном случае)grep -z
весь файл будет обрабатываться как одна строка. Так (1) это поднимает вопрос о том, насколько хорошо он может обрабатывать большие файлы, и (2) если он найдет совпадение, он выпишет весь файл, не давая подсказки относительно местоположения совпадения. Также (3) ФП сказал: «в идеале, обрабатывать любую последовательность пробелов как один пробел», поэтому вы должны использовать\s+
и добавить-E
.-o
; Я продолжаю забывать об этом. Умный способ использовать его. (1)grep
начинается ваш новый ответ^[\n]*
; это опечатка для[^\n]*
. (2) Я сказал\s+
сознательно.be\s*little
будет соответствоватьbelittle
, иcare\s*less
будет соответствоватьcareless
. Но я думаю, что это небольшая проблема. И, если вы не хотите использовать-E
, вы можете использовать «версию бедного человека» из\s+
, а именно\s\s*
. (3) Хорошаяsed
команда. Он может потерпеть неудачу, если есть пустые строки (поэтому фраза из четырех слов может занимать более четырех строк); Я смог это исправить, добавивs/\n\s*\n/\n/
.-E
вас сталь в состоянии использовать+
в\s\+
форме. Пустые линии внутри рисунка кажутся надуманными.grep
них для фраз.Попробуй это:
источник
\s
5 раз, если я ищу «это очень длинный шаблон»?\s
соответствует пробелам, а символ новой строки - это пробел.This\nis a very\nlong pattern
, и я не знаю, где могут произойти разрывы строки. Я должен был бы искатьThis\sis\sa\svery\slong\spattern
, верно? (который становится утомительным, когда длина рисунка увеличивается или вставляется из другого места)pcregrep -M "$( echo 'This is a very long pattern' | sed 's/ /\\s+/g' )" file
.