我当前工作目录中的唯一文件名为test.txt
,其内容很简单:
This is a little test file.
- 执行
没有匹配。grep -in * -e 'te.?t file'
- 但转义
?
有效:
给出匹配grep -in * -e 'te.\?t file'
疯狂:有了明星*
,事情就反过来了!
- 无需转义:
给出匹配grep -in * -e 'te.*t file'
- 并且转义
*
不起作用:
没有匹配grep -in * -e 'te.\*t file'
为什么元字符在转义方面有?
区别*
对待?
这只是 使用的语法规范
grep
。在没有任何附加标志的情况下,(GNU)grep
使用基本正则表达式,这需要对一些元字符(纯形式(1),括号)进行转义。另请参阅grep
手册页:这意味着在 BRE 模式下,
?
如果要将 视为元字符,则必须进行转义,而 则不必如此*
。为了获得更“直观”的行为,您可能需要切换grep
到扩展正则表达式 (ERE) 模式:(1)请注意
\|
, BRE 模式下的\+
和实际上是非标准扩展,但受 GNU 和 Busybox (可能还有其他扩展)\?
支持。另请参阅Eli Minkoff 的回答。grep
另外需要注意的是,正如@Kusalananda所建议的,
sed
可以帮助调试RegExp:grep
默认情况下使用基本正则表达式,这是一种更有限的方言,不支持?
或+
运算符。如果使用反斜杠转义,GNU 和 FreeBSDgrep
实现确实支持它们,但这不是标准的。如果您希望 grep 使用扩展正则表达式,这是一种更现代的方言,确实支持它们,您可以使用标志调用它-E
:或者,特别是使用 GNU grep,