![使用重复范围 {} 和 grep](https://linux22.com/image/1059003/%E4%BD%BF%E7%94%A8%E9%87%8D%E5%A4%8D%E8%8C%83%E5%9B%B4%20%7B%7D%20%E5%92%8C%20grep%20.png)
$ 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
括号扩展模式,它被扩展bash
为a2 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,}
永远不会与当前输入匹配。