您的备忘单可能会声明这\d{4}
是一个有效的正则表达式,意思是“四位数”;它可能会声明grep
在文件中搜索正则表达式。分开来看,这两种说法都是正确的。但总的来说,它们具有高度误导性,因为grep PATTERN FILE
期望一种正则表达式(POSIX“基本正则表达式”,BREs),而\d
and{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
。