通过正则表达式在bash中进行Grep哈希

问题描述:

我想grep用于字符串中的十六进制哈希,并只提取这些哈希值。通过正则表达式在bash中进行Grep哈希

我在网上正则表达式测试工具,做的伎俩测试正则表达式:

\b[0-9a-f][0-9a-f]+[0-9a-f]\b 

\b用于设置字边界(开始&结束),应该是任何字符0-9a-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需要这种逃避的外壳:

事实上,外壳版本也只有当我逃离量词+用反斜杠工作?

我相当简单的方法有什么缺点吗?

+0

你也可以使用'-w'选项来与之匹配,而不必使用'\唯一的话b's – Sundeep

我不知道为什么一元字符需要在bash中进行转义,但你的正则表达式可以改写为这样的:

grep --only-matching -e "\b[0-9a-f]{3,}\b" 
+0

感谢输入!你知道为什么这也匹配3个字符的十六进制?我最初认为这应该将搜索字符串分隔为以*和*结尾且至少包含3个十六进制字符的十六进制,因此整个字符串至少应具有长度6. – daniel451

+0

您的原始正则表达式意味着您希望匹配3个或更多十六进制字符。你想匹配多少? –

+0

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,}
+0

感谢您的解释!你可以添加一个解释什么是POSIX? '-e'和'-E'有什么区别? 'man grep'只说'-e'搜索正则表达式,而'-E'则用于扩展正则表达式...什么是扩展正则表达式? – daniel451

+1

请参阅[POSIX基本和扩展正则表达式](http://www.regular-expressions.info/posix.html)以了解关于BRE和ERE的更多信息。 – SLePort

+0

非常感谢!对于扩展正则表达式:不应该'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