Перехресна безпечна відповідь (включаючи 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 / тощо ... Яке слово чи регулярний вираз ви б шукали тоді ви! Поки ви залишаєтесь 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