用于搜索子字符串的Linux命令

时间:2015-09-07 04:18:14

标签: linux shell

我想找到' on'作为字符串的前缀或后缀,但不是它在中间的位置。

举个例子, 我的文字中包含' on',' one',' cron'' stone'。我想找到包含确切单词' on'还有像“一个人”这样的词。和' cron',但它不应该匹配石头。

4 个答案:

答案 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,如果可以完成,你将不得不更加努力地工作。

请注意,此解决方案假设混合数字和字母不是'字'在此上下文中(因此不应选择on2424on)。如果您不介意将数字作为单词的一部分出现在开头或结尾,那么您可以使用其他两个答案:

或者你可以将这个破坏成形,这样就可以完成他们的任何一个。

答案 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;