包含两个或更多单词的 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 任何东西,而 strB
和 strC
应该。
我试过这个命令: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.
我有三个字符串
strA="a b mam am"
strB="a b a"
strC="a b a c"
我想 grep 包含两个或更多单词 "a" 的字符串,所以 strA
不应该 return 任何东西,而 strB
和 strC
应该。
我试过这个命令: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.