Кросс-дистрибутив безопасный ответ (включая windows 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
. Смотрите страницу Википедии по регулярному выражению для получения дополнительной информации.
В конечном счете, ответ POSIX выше будет намного более надежным независимо от платформы (являющейся оригинальной) для grep
Что касается поддержки grep без опции -o, первый grep выводит соответствующие строки, tr разделяет пробелы на новые строки, конечный grep фильтрует только для соответствующих строк.
(PS: я знаю, что большинство платформ уже были бы исправлены для \ w ...., но всегда есть те, которые отстают)
Кредит для обхода "-o" из ответа @AdamRosenfield