尝试将连字符与 grep 2.27 匹配时的奇怪行为

man*_*tor 2 grep regular-expression

我有以下字符串:

-----BEGIN 1_1 CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

以下序列与连字符不匹配:

grep -- "[A-Z\-\_]" file
Run Code Online (Sandbox Code Playgroud)

当我删除\_连字符匹配时:

grep -- "[A-Z\-]" file
Run Code Online (Sandbox Code Playgroud)

如果我删除反斜杠,我会得到grep: Invalid range end. 此外,我是否使用也无关紧要-E/egrep- 我得到了相同的结果。

这种行为的原因是什么?

Kus*_*nda 9

将连字符与 a 匹配时[...],连字符需要在其中的第一个或最后一个:

grep '[A-Z_-]' ...
Run Code Online (Sandbox Code Playgroud)

如果您将连字符放在其他任何位置,它将被视为指定范围。

此外,\是字面量 in [...](如果整个表达式在 shell 中被引用),因此[\-]匹配反斜杠或连字符,并且[\-_]可能匹配\, ],^_(这些是ASCII 表中范围从\_的字符)。