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

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

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

grep "t{2}" textfile

尽管我知道文本文件包含“rotten”“litter”等单词,但 grep 命令没有显示任何行,但退出状态为 1。

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

grep "a.*x" textfile

对于这个来说它有效。

答案1

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

grep 't\{2\}' textfile

或者,您可以使用该-E选项(或GNU grep 的 -P 选项,它使用Perl 兼容的正则表达式grep利用扩展正则表达式,它可以使用大括号而不转义它们:

grep -E 't{2}'

答案2

您需要转义大括号:

grep 't\{2\}' textfile

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

答案3

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

根据 GNU grep(1) 手册页有关基本正则表达式与扩展正则表达式,即如果您选择不使用这些选项:

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

相关内容