我有以下字符串:
-----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 表中从到_
范围内的字符)。\
_