$ 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
大括号扩展模式,它被bash
as扩展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 令牌。因此,您可以使用-E
option 将模式视为 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,}
永远不会与当前输入匹配。