您的备忘单可能会声明这\d{4}是一个有效的正则表达式,意思是“四位数”;它可能会声明grep在文件中搜索正则表达式。分开来看,这两种说法都是正确的。但总的来说,它们具有高度误导性,因为grep PATTERN FILE期望一种正则表达式(POSIX“基本正则表达式”,BREs),而\dand{4}是来自不同类型正则表达式的符号(有时称为“Perl Compatible Regular Expressions”,PCREs ,在 Perl 编程语言之后)。
许多版本都grep支持一个-P标志来指示该模式是 PCRE 而不是 BRE;你可以试试:
grep -P '\d{4}' file.txt
(注意 . 周围的单引号\d{4}。这些是必要的,因为否则 Bash 将\d作为 的一种简写'd',因此传递给的实际模式grep将是d{4},意思是“四个d”而不是“四个数字”。或者,您可以write grep -P \\d{4} file.txt,它以不同的方式解决了相同的问题。)
编辑添加:对不起,我未能涵盖您问题的第二部分,关于+. 因此,根据相关规范,1:
grep .+ file.txt
用于.表示“除 NUL 之外的任何字符”并+表示“实际的加号”。所以它真的应该打印file.txt包含非初始加号的行;如果您看到不同的行为,那么您的外壳和/或grep必须是不合格的。
此外,这:
grep .\+ file.txt
与上述相同,因为符合 POSIX 的 shell(例如 Bash)将\+视为一种奇特的编写方式+,因此grep将看到与以前相同的参数。(grep将无法知道您输入的.\+是不是.+.)
最后,这个:
grep '.\+' file.txt
(\实际传递到 的地方grep)具有未定义的行为:给定的grep实现可以将其.+视为\+与给出错误信息。碰巧的是,GNU 实现采用“一种或多种”解释,但其他可能不同。
脚注:
- 即规范,
grep以及BRE 和 ERE 规范(grep规范链接和引用)。同样相关的是shell 规范,因为它是 shell 决定传递给的实际参数grep。