我想 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"
在 shell 中不起作用,而正则表达式 \b[0-9a-f][0-9a-f]*[0-9a-f]\b
在在线正则表达式中起作用测试工具。
事实上,只有当我用反斜杠转义量词 +
时,shell 版本才起作用:
grep --only-matching -e "\b[0-9a-f][0-9a-f]\+[0-9a-f]\b"
^
|_ escaped +
为什么 grep
需要在 shell 中进行转义?
我相当简单的方法有什么缺点吗?
最佳答案
我不知道为什么需要在 bash 中转义元字符,但您的正则表达式可以重写为:
grep --only-matching -e "\b[0-9a-f]{3,}\b"
关于regex - 在 bash 中通过正则表达式进行 Grep 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560358/