【问题标题】:Linux Shell - Grep commandLinux Shell - Grep 命令
【发布时间】:2013-11-21 13:04:06
【问题描述】:

我在使用带有以下选项的 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\},我真的不明白它的作用。

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

【问题讨论】:

    标签: linux shell command-line grep command


    【解决方案1】:

    来自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.
    

    该示例 grep 'a\{2,3\}' new 也匹配带有 aaaa 的行,因为前三个(或 2 个)a。该行的其余部分并不重要。

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

    顺便说一句。我建议使用-E 标志(或egrep 相同),这样您就可以扩展正则表达式支持。那你就不必转义括号了。

    输入

    aaaaa
    aaaa
    aaa
    aa
    a
    

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

    aaa
    aa
    

    【讨论】:

    • 非常感谢!很好的答案!
    • 感谢您提供额外信息。我实际上是在搜索有关 grep -E 的信息!非常感谢!
    【解决方案2】:

    grep 'a\{n,m\}' new 表示从 new 中抓取至少 n 个 a 和最多 m 个 a
    比如grep 'a\{2,3\}' new会输出

    aaaa
    aaa
    aa
    

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

    【讨论】:

    • @Exsound 这很正常,因为aaaa确实包含1或2或3个as。因此打印出来了。事实上,对于a\{1,3\},任何只包含一个a 的行都会被打印出来。
    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多