如何在 grep 中使用常规模式运算符 {m,n}?

Abd*_*red 7 command-line grep regular-expression

我有一个文本文件,我只需要从中选择那些包含字符串“tt”的行。所以我在命令行上尝试了这个:

grep "t{2}" textfile
Run Code Online (Sandbox Code Playgroud)

尽管我知道文本文件包含诸如“腐烂”“垃圾”之类的词,但 grep 命令不显示任何行,但退出状态为 1。

我尝试了另一种常规模式:

grep "a.*x" textfile
Run Code Online (Sandbox Code Playgroud)

对于这一点,它有效。

cuo*_*glm 15

默认情况下,grep使用基本正则表达式,您需要对大括号进行转义以使 grep 匹配多个字符:

grep 't\{2\}' textfile
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用-E选项(或-P GNU grep 选项,它使用Perl Compatible Regular Expressions)来grep使用Extended Regular Expressions,它可以使用大括号而无需转义它们:

grep -E 't{2}'
Run Code Online (Sandbox Code Playgroud)

  • 您应该直接调用 `grep -E`,调用 `egrep` 已被弃用,提供它是为了允许依赖它们的历史应用程序未经修改地运行。 (2认同)

jim*_*mij 7

您需要转义大括号:

grep 't\{2\}' textfile
Run Code Online (Sandbox Code Playgroud)

否则{}被视为文字字符。


vin*_*c17 7

您需要使用-E( --extended-regexp) 或-P( --perl-regexp) 选项(使用 GNU grep)。

根据关于Basic vs Extended Regular Expressions的 GNU grep(1) 手册页,即如果您选择不使用这些选项:

在基本的正则表达式中,元字符 ?、+、{、|、( 和 ) 失去了它们的特殊意义;而是使用反斜杠版本 \?、\+、\{、\|、\( 和 \)。