尝试使用 grep 2.27 匹配连字符时出现奇怪的行为

尝试使用 grep 2.27 匹配连字符时出现奇怪的行为

我有以下字符串:

-----BEGIN 1_1 CERTIFICATE-----

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

grep -- "[A-Z\-\_]" file

当我删除\_连字符时,它们是匹配的:

grep -- "[A-Z\-]" file

如果我删除反斜杠,我会得到grep: Invalid range end.另外,无论我使用-E/egrep与否,我都会得到相同的结果。

这种行为的原因是什么?

答案1

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

grep '[A-Z_-]' ...

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

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

相关内容