使用重复范围 {} 和 grep

使用重复范围 {} 和 grep
$ grep a{2,} alphabet.txt
grep: a: No such file or directory
$cat alphabet.txt
abcdefghijklnmopqrstuvwxyz

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

答案1

提前转义你的 Regex 模式以避免被 shell 解释。

您已使用模式a{2,},无需任何转义,因为这是一个有效的bash括号扩展模式,它被扩展basha2 a

因此最终grep得到的结果是:

grep a2 a alphabet.txt

由于该文件a不存在,因此出现相关错误。


只需使用任何一种通常的方式就可以摆脱这种模式:

grep 'a{2,}' alphabet.txt
grep "a{2,}" alphabet.txt
grep a\{2,\} alphabet.txt

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


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

grep -E 'a{2,}' alphabet.txt

或者在 BRE 中转义括号:

grep 'a\{2,\}' alphabet.txt

附带说明一下,您的输入文件不包含两个或多个连续的a,因此模式a{2,}永远不会与当前输入匹配。

相关内容