包含两个或更多单词的 Grep 字符串

Grep strings containing two or more words

我有三个字符串

strA="a b mam am"
strB="a b a"
strC="a b a c"

我想 grep 包含两个或更多单词 "a" 的字符串,所以 strA 不应该 return 任何东西,而 strBstrC应该。

我试过这个命令:echo "a b a" | grep "a *a" 但为什么它不起作用?

因为“</code> <code>*”匹配零个或多个空格,除此之外别无其他。 "anything" 的正则表达式是 .*(点匹配任何字符,星号允许零次或多次重复)。但是,这将匹配 mam am 而你显然想要单词匹配,所以尝试

grep '\<a\>.*\<a\>'

如果您的 grep 支持 -P 选项,您可以尝试

$ echo "a b a" | grep -P "\ba\b.*\ba\b"
a b a
  • \b 匹配单词边界

  • \ba\b 匹配 words "a"

Grep 可以接受更复杂的正则表达式:

grep -E "\ba\b.*\ba\b"

细分:

  • \b - 字边界
  • a - 单词
  • \b - 字边界
  • .* - 零个或多个字符
  • \b - 字边界
  • a - 单词
  • \b - 字边界

\b 标记单词边界 的结尾,并表示单词是在行首、中间还是结尾。是否被空格、制表符包围,或者周围有标点符号。

您可以使用 \+ 而不是 \*,因为您仍在指定单词边界,所以任何一个都会捕获 a a.

注意我使用 -E 作为 grep 中的参数。这确保使用更复杂的正则表达式。在 Gnu grep 中,这没有区别,但在 BSD 平台上,如 Mac OS X.