使用重复范围 {} 和 grep

Min*_*t.K 4 command-line grep

$ grep a{2,} alphabet.txt
grep: a: No such file or directory
$cat alphabet.txt
abcdefghijklnmopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)

我的字母表.txt 包含一个从 a 到 z 的行。a{2,} 不是表示匹配 aaa* 吗?但是,grep它甚至不起作用。

hee*_*ayl 13

转义您的 Regex 模式以避免事先解释 shell。

您已经使用了 pattern a{2,},没有任何转义,因为这是一个有效的bash大括号扩展模式,它被bashas扩展a2 a

所以最终grep得到的是:

grep a2 a alphabet.txt
Run Code Online (Sandbox Code Playgroud)

由于该文件a不存在,因此有关它的错误。


只需使用任何通常的方式来逃避模式:

grep 'a{2,}' alphabet.txt
grep "a{2,}" alphabet.txt
grep a\{2,\} alphabet.txt
Run Code Online (Sandbox Code Playgroud)

在这里,建议使用单引号,除非您有要扩展的变量——在这种情况下使用双引号。尽量避免反斜杠转义,因为这可能会混淆模式并使它们不可读,例如在转义 BRE(基本正则表达式)中的 ERE(扩展正则表达式)标记时;您需要 (blackslash) 转义两次以使引擎将它们视为 ERE 令牌。


即使是现在,大括号也会按字面意思处理,因为grep默认情况下使用 BRE 引擎,而匹配的范围{}实际上是 ERE 令牌。因此,您可以使用-Eoption 将模式视为 ERE:

grep -E 'a{2,}' alphabet.txt
Run Code Online (Sandbox Code Playgroud)

或者在 BRE 中转义大括号:

grep 'a\{2,\}' alphabet.txt
Run Code Online (Sandbox Code Playgroud)

作为旁注,您的输入文件不包含两个或多个连续的a's,因此该模式a{2,}永远不会与当前输入匹配。