准确获取匹配的单词

准确获取匹配的单词

我浏览了一些问题,但他们没有满意地回答我的问题。

我需要打印与模式完全匹配的单词,而不是包含该单词的行。例如:

我正在回家。心所在的地方就是家。

所以当我用模式“home”搜索时,我应该得到

主页 主页

我明白那个 grep -o 会让我的任务更容易,但是 我的 grep 不支持该选项。所以我需要一些其他的解决方案。

我还需要完全匹配。因此,如果有一个单词,homeless则不应在选择中选择它。

答案1

和谁玩perl

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

甚至更短,改编自约瑟夫·R。下面评论(感谢他)

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

结果:

home
Home

答案2

您可以使用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 标准。

答案3

使用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

答案4

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

输出

首页首页

相关内容