通过正则表达式在bash中进行Grep哈希
我想grep用于字符串中的十六进制哈希,并只提取这些哈希值。通过正则表达式在bash中进行Grep哈希
我在网上正则表达式测试工具,做的伎俩测试正则表达式:
\b[0-9a-f][0-9a-f]+[0-9a-f]\b
的\b
用于设置字边界(开始&结束),应该是任何字符0-9
或a-f
。由于我不知道哈希是否为128位或更高,我不知道哈希的长度。因此,我在中间设置了[0-9a-f]+
,以匹配任意数量的[0-9a-f]
,但至少有一个(因为没有散列只包含用边界\b
检查的两个字符)。
然而,我注意到,
grep --only-matching -e "\b[0-9a-f][0-9a-f]+[0-9a-f]\b"
不会在外壳的工作,而在网上正则表达式测试工具\b[0-9a-f][0-9a-f]*[0-9a-f]\b
工作的正则表达式。
grep --only-matching -e "\b[0-9a-f][0-9a-f]\+[0-9a-f]\b"
^
|_ escaped +
为什么grep
需要这种逃避的外壳:
事实上,外壳版本也只有当我逃离量词+
用反斜杠工作?
我相当简单的方法有什么缺点吗?
我不知道为什么一元字符需要在bash中进行转义,但你的正则表达式可以改写为这样的:
grep --only-matching -e "\b[0-9a-f]{3,}\b"
感谢输入!你知道为什么这也匹配3个字符的十六进制?我最初认为这应该将搜索字符串分隔为以*和*结尾且至少包含3个十六进制字符的十六进制,因此整个字符串至少应具有长度6. – daniel451
您的原始正则表达式意味着您希望匹配3个或更多十六进制字符。你想匹配多少? –
3个或更多是完全正确的,所以你的答案是好的。对不起,如果我的评论不明确。我想问*为什么这个正则表达式匹配3个或更多的字符,因为我认为双字符\ b'的边界应该暗示字符串必须以**开头**和**以3个或更多字符结束, 0-9a-f]'(由于量化{3,}'),因此搜索字符串总共必须包含至少6个字符(3表示开始*,* 3表示结束)。 – daniel451
的+
量词是不是POSIX基本正则表达式的一部分(又名BRE),所以你必须在BRE模式下用grep
逃避它。
作为替代方案,您可以:
- 的
-E
标志添加到grep
:grep -E --only-matching -e "\b[0-9a-f][0-9a-f]+[0-9a-f]\b"
- 使用
[0-9a-f][0-9a-f]*
或[0-9a-f]{1,}
感谢您的解释!你可以添加一个解释什么是POSIX? '-e'和'-E'有什么区别? 'man grep'只说'-e'搜索正则表达式,而'-E'则用于扩展正则表达式...什么是扩展正则表达式? – daniel451
请参阅[POSIX基本和扩展正则表达式](http://www.regular-expressions.info/posix.html)以了解关于BRE和ERE的更多信息。 – SLePort
非常感谢!对于扩展正则表达式:不应该'grep - 只匹配-E“\ b [0-9a-f] [0-9a-f] + [0-9a-f] \ b”'是否足够?结合'-E'和'-e'是否有所作为? – daniel451
grep的默认运行基本的正则表达式。你需要躲避+
量词用反斜杠,因为它是在documentation说:
在基本的正则表达式的元字符
?
,+
,{
,|
,(
和)
失去了特殊的意义;改为使用反斜杠 版本\?
,\+
,\{
,\|
,\(
和\)
。
而且,也没有必要-e
选项,只是
grep -o '\b[0-9a-f]\+\b' file
你也可以使用'-w'选项来与之匹配,而不必使用'\唯一的话b's – Sundeep