Есть ли способ заставить grep выводить «слова» из файлов, которые соответствуют поисковому выражению?
Если я хочу найти все экземпляры, скажем, «th» в нескольких файлах, я могу сделать:
grep "th" *
но на выходе будет что-то вроде (жирным шрифтом - я);
некоторые-текст-файл: кот сидел на за мат некоторые-другой-текстовый файл: шустрая лисица еще один текстовый файл: я надеюсь, что это объясняет это полностью
То, что я хочу вывести, используя тот же поиск, это:
the
the
the
this
thoroughly
Возможно ли это с помощью grep? Или используя другую комбинацию инструментов?
Ответы:
Попробуй grep -o
Изменить: в соответствии с комментарием Фила
Из документов :
источник
"\w*th\w*" *
значит, поэтому я решил опубликовать.\w
is [_ [: alnum:]], так что это соответствует практически любому «слову», которое содержит «th» (так\w
как не включает пробел). Знак * после цитируемого раздела - это глобус, для которого файлы (то есть совпадающие со всеми файлами в этом каталоге)\w
обычно не переносимgrep -E
; для правильной переносимости используйте[[:alnum:]]
вместо этого имя класса символов POSIX (или,[_[:alnum:]]
если вы действительно хотите, чтобы подчеркивание тоже; или попробуйте,grep -P
если ваша платформа имеет это).-h
я бы сказал, что это совершенно необходимо.Кросс-дистрибутив безопасный ответ (включая windows minGW?)
Если вы используете более старые версии grep (например, 2.4.2), который не включает опцию -o. Используйте вышеупомянутое. Еще используйте более простую версию для поддержки ниже.
Linux кросс-дистрибутив безопасный ответ
Для подведения итогов
-oh
регулярное выражение соответствует содержимому файла (а не его имени файла), так же, как вы ожидаете, что регулярное выражение будет работать в vim / etc ... Какое слово или регулярное выражение вы бы искали тогда, до вы! Пока вы остаетесь в POSIX, а не в синтаксисе perl (см. Ниже)Больше из руководства для grep
Причина, почему оригинальный ответ не работает для всех
Использование
\w
варьируется от платформы к платформе, так как это расширенный синтаксис "perl". Таким образом, те установки grep, которые ограничены для работы с классами символов POSIX, используют,[[:alpha:]]
а не его perl-эквивалент\w
. Смотрите страницу Википедии по регулярному выражению для получения дополнительной информации.В конечном счете, ответ POSIX выше будет намного более надежным независимо от платформы (являющейся оригинальной) для grep
Что касается поддержки grep без опции -o, первый grep выводит соответствующие строки, tr разделяет пробелы на новые строки, конечный grep фильтрует только для соответствующих строк.
(PS: я знаю, что большинство платформ уже были бы исправлены для \ w ...., но всегда есть те, которые отстают)
Кредит для обхода "-o" из ответа @AdamRosenfield
источник
-o
Опция отсутствует в Windows grep, который устанавливается вместе с пакетом git (minGW?):"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
Это проще, чем вы думаете. Попробуй это:
Куда,
источник
Вы можете перевести пробелы в новую строку, а затем grep, например:
источник
tr
, он мог сделать вgrep
первую очередь, поэтомуtr
будет применяться только к соответствующим линиям:grep th filename | tr ' ' '\n' | grep th
Просто
awk
не нужно сочетание инструментов.источник
команда grep только для сопоставления и perl
источник
th
потому, что вы запросили кратчайшее повторение подстановочного знака.Я был недоволен трудно запоминающимся синтаксисом awk, но мне понравилась идея использовать одну утилиту для этого.
Кажется, что ack (или ack-grep, если вы используете Ubuntu) может легко это сделать:
Если вы опустите флаг -h, вы получите:
В качестве бонуса вы можете использовать
--output
флаг, чтобы сделать это для более сложных поисков, используя самый простой синтаксис, который я нашел:источник
источник
cat
?Для поиска всех слов, начинающихся с «icon-», следующая команда работает отлично. Я использую здесь Ack, который похож на grep, но с лучшими параметрами и хорошим форматированием.
источник
Вы также можете попробовать pcregrep . Также есть
-w
опция в grep , но в некоторых случаях она работает не так, как ожидалось.Из Википедии :
источник
У меня была похожая проблема, когда я искал grep / pattern regex и «соответствовал шаблон найден» в качестве вывода.
В конце я использовал egrep (то же самое регулярное выражение для grep -e или -G не дало мне того же результата egrep) с опцией -o
Итак, я думаю, что это может быть что-то похожее (я НЕ мастер регулярных выражений):
источник
{1}
квантификаторы должны быть отброшены. Или если вы хотите быть последовательным иt{1}h{1}e{1}
т. Д.Вы можете перенаправить вывод grep в Perl следующим образом:
источник
Выдержка из справочной страницы grep:
-w: выбрать только те строки, которые содержат совпадения, которые образуют целые слова. Тест состоит в том, что соответствующая подстрока должна быть либо в начале строки, либо предшествовать не состоящему из слова символу.
источник
the
больше не совпадало, например, с "этими" или "купаться".ripgrep
Вот пример использования
ripgrep
:Это будет соответствовать всем словам соответствия
th
.источник