1

我在使用带有以下选项的 grep 时遇到问题\{n\}\{n,\}\{n,m\}. 我有一个名为“new”的文件,其中包含以下几行:

aaaa
aaa
aa
a

当我使用grep 'a\{1\}' new我得到这个输出:

aaaa
aaa
aa
a

所以,基本上,这个命令将显示包含 1 个或多个连续出现的字符“a”的行,对吗?

另外,grep 'a\{1,\} new会做同样的事情grep 'a\{1\}' new吗?因为我得到了相同的输出。

最后一个,\{n,m\}我无法真正理解它的作用。

如果有人可以帮助我,我将不胜感激。

4

2 回答 2

2

grep 'a\{n,m\}' new意味着从新的 grepping 至少 n 个a,最多 m 个a
例如,grep 'a\{2,3\}' new将输出

aaaa
aaa
aa

最后一行不匹配,因为它只有 ONE a
对于a{n,\}',省略m意味着任何大于或等于 的数字n

于 2013-11-09T15:13:58.303 回答
2

来自man grep

   Repetition
       A regular expression may be  followed  by  one  of  several  repetition
       operators:
       ?      The preceding item is optional and matched at most once.
       *      The preceding item will be matched zero or more times.
       +      The preceding item will be matched one or more times.
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {n,m}  The  preceding  item  is  matched at least n times, but not more
              than m times.

由于前三个 (or 2) ,该示例grep 'a\{2,3\}' new也与行匹配。该行的其余部分并不重要。aaaaa

如果您希望真的只有 2 或 3 个连续a匹配,您可以使用该-o标志。但请注意,这将输出aaaaa从带有aaaaa. 为避免这种情况,您必须使用附加信息,例如示例换行符^$.

顺便提一句。我建议使用该-E标志(或egrep相同的标志),以便您扩展正则表达式支持。然后,您不必转义括号。

用于输入

aaaaa
aaaa
aaa
aa
a

调用grep -o -E '^a{2,3}$'将给出输出:

aaa
aa
于 2013-11-09T15:28:51.603 回答