Правильное совпадение слов

Я просмотрел ряд вопросов, но они не удовлетворительно отвечают на мой вопрос.

Мне нужно напечатать слова, которые соответствуют шаблону, а не строки, содержащие это слово. Например:

Я иду домой. Главная – это сердце.

Поэтому, когда я ищу с шаблоном «домой», я должен получить

Главная Главная

Я понимаю, что grep -o упростит мою задачу, но мой grep не поддерживает этот параметр. Поэтому мне нужно другое решение.

Также мне нужно точное совпадение. Так что, если есть слово homeless его не следует выбирать в выборе.

Игра с perl :

 $ echo 'I am going home. Home is where heart is.' | perl -lne 'for (split /\W+/) {print $& if /\bhome\b/i}' 

И даже короче, адаптированный от Джозефа Р. комментировать рев (спасибо ему)

 $ echo 'I am going home. Home is where heart is.' | perl -lne 'print $& while /\bhome\b/ig' 

Результат:

 home Home 

используя awk :

 echo "I am going home. Home is where heart is. I dont like Homework." | awk '{for(i=1;i<=NF;i++) {gsub(/[^a-zA-Z0-9]/,"",$i); if(match(tolower($i),/^(home)$/))print $i;}}' 

вывод:

 home. Home 

Использование awk для поиска целых слов, похожих на grep -o -w :

 $ echo "I am going home. Home is where heart is." | awk -v 'RS=[^[:alnum:]_]' -vw="home" 'tolower($0)==w' home Home 

Как указывает Жиль, для этого требуется awk , например GNU awk , который поддерживает регулярные выражения для RS .

Вы можете использовать tr для нормализации разделителей слов, затем grep для печати соответствующих слов (с параметрами -Fx чтобы точно соответствовать строке и -i для нечувствительности к регистру).

 tr -cs A-Za-z \\n | grep -Fxi home 

Если вы находитесь в не-ASCII-локали, обратите внимание, что многие реализации tr работают с байтами, а не с символами. Используйте другой инструмент, например sed, для выполнения нормализации разделителя слов.

 sed 's/[^[:alpha:]][^[:alpha:]]*/\n/g' | grep -Fxi home 

Все команды в этом ответе являются стандартом POSIX.

 printf %s\\n 'I am going home. Home is where the heart is.' | sed 's/\([hH]ome\)*.\{,1\}/\1/g' 

ВЫВОД

ГлавнаяГлавная

Вы можете перебирать слова, grep заданное слово и удалять знаки пунктуации

 $ s="I am going home. Home is where heart is." $ for w in $s; do echo $w; done | grep -Ei '(^|[[:punct:]]*)home([[:punct:]]*|$)' | tr -d '[[:punct:]]' home Home