Ответ перекрестного распределения (включая окна minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
Если вы используете более старые версии grep (например, 2.4.2), который не включает опцию -o. Используйте вышеупомянутое. Еще используйте более простую версию для поддержки ниже.
Ответ о перекрестном распространении Linux
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
Для суммирования -oh
выводит совпадения регулярного выражения с содержимым файла (а не с именем файла), так же, как вы ожидаете, что регулярное выражение будет работать в vim / etc ... Какое слово или регулярное выражение вы будете искать тогда это зависит от вас! Пока вы остаетесь в POSIX, а не в синтаксисе perl (см. Ниже)
Больше из руководства по grep
-o Print each match, but only the match, not the entire line.
-h Never print filename headers (i.e. filenames) with output lines.
-w The expression is searched for as a word (as if surrounded by
`[[:<:]]' and `[[:>:]]';
Причина, по которой оригинальный ответ не работает для всех
Использование \w
варьируется от платформы к платформе, так как это расширенный синтаксис "perl". Таким образом, те установки grep, которые ограничены для работы с классами символов POSIX, используют [[:alpha:]]
, а не его perl-эквивалент \w
. Подробнее о 1030 *
см. На странице Википедии о регулярном выражении.
В конечном счете, ответ POSIX выше будет намного более надежным независимо от платформы (являющейся оригинальной) для grep
Что касается поддержки grep без опции -o, первый grep выводит соответствующие строки, tr разделяет пробелы на новые строки, окончательный grep фильтрует только соответствующие строки.
(PS: я знаю, что большинство платформ к настоящему времени было бы исправлено для \ w ...., но всегда есть те, которые отстают)
Кредит для обхода "-o" от ответа @AdamRosenfield