我想找到' on'作为字符串的前缀或后缀,但不是它在中间的位置。
举个例子, 我的文字中包含' on',' one',' cron'' stone'。我想找到包含确切单词' on'还有像“一个人”这样的词。和' cron',但它不应该匹配石头。
答案 0 :(得分:2)
如果您已获得GNU grep
或BSD grep
,那么它相对简单:
grep -E '\b(on[[:alpha:]]*|[[:alpha:]]*on)\b'
这会查找单词边界,然后按' on'零个或多个字母字符,或零个或多个字母字符后跟' on'后跟一个单词边界。
例如,给定数据:
on line should be selected
cron line should be selected
stone line should not be selected
station wagon
onwards, ever onwards.
on24 is not selected
24on is not selected
示例运行:
$ grep -E '\b(on[[:alpha:]]*|[[:alpha:]]*on)\b' data
on line should be selected
cron line should be selected
station wagon
onwards, ever onwards.
$
使用严格的POSIX兼容grep
,如果可以完成,你将不得不更加努力地工作。
请注意,此解决方案假设混合数字和字母不是'字'在此上下文中(因此不应选择on24
和24on
)。如果您不介意将数字作为单词的一部分出现在开头或结尾,那么您可以使用其他两个答案:
或者你可以将这个破坏成形,这样就可以完成他们的任何一个。
答案 1 :(得分:2)
我很惊讶没有人提出简单明了的
grep -E '\<on|on\>' files ...
元字符序列\<
和\>
分别匹配左右字边界。我相信它应该可以移植到任何现代平台上(尽管如果Solaris,HP-UX或AIX需要一些调整以使其工作,我会不会感到惊讶。)
答案 2 :(得分:1)
您可以使用egrep(正则表达式)来捕捉确切的短语:通过使用\b
(单词边界),您可以确保不会捕获除了所需的3个单词之外的任何其他内容:
egrep -e '\b(on|one|cron)\b' <filename>
<强>更新强>
自问题编辑以来&amp;澄清说OP希望将on
“作为字符串的前缀或后缀”:
egrep -e '\bon|on\b' <filename>
答案 3 :(得分:0)
如果您只是“全力以赴”。并使用子串搜索任何内容&#39; on&#39;在里面(留下&#39; stone&#39;)......
grep '[A-Za-z]on[A-Za-z]' <your file name> | grep -v 'stone'
再次使用grep
命令进行管道会隐藏任何结果&#39; stone&#39;