Phi*_*ide 2 text-processing wildcards files pattern-matching
我已经导出了非常大的 10 年电子邮件存档。
我想解析任何长度为 64 个字符的字符串的所有文本以搜索比特币私钥。
如何解析特定长度的字符串?
如果您要找的是不是以十六进制形式(从范围为64个字符一个256位的数字0-9
和A-F
-的,其中比特币的私钥可以显示的格式之一),这应该这样做:
egrep -aro '\<[A-F0-9]{64}\>' files and dirs ...
Run Code Online (Sandbox Code Playgroud)
如果某些键为小写,则添加-i
选项或还包括a-f
范围。
对于从具有指定长度的同一类中查找字符运行的一般问题,您最好使用 pcre regexp,它可以与带有-P
选项的GNU grep 一起使用。例如,要从任何字符集中查找大写字母,最小长度为 2,最大长度为 4,并且由非大写字母的字符分隔:
echo ÁRVÍZt?r? tükörFÚRÓgép |
LC_CTYPE=en_US.UTF-8 grep -Po '(?<!\p{Lu})\p{Lu}{2,4}(?!\p{Lu})'
FÚRÓ
Run Code Online (Sandbox Code Playgroud)
更换\p{Lu}
用\p{Ll}
小写字母,\S
非空格等见这里和这里的完整列表。
(?<!...)
并且(?!...)
是负后视和前瞻零宽度断言;例如,(?<!<)\w(?!>)
当没有用<
和括起来时,将匹配一个“单词”字符>
。来自的\<
零宽度断言vi
可以由 实现(?<!\w)(?=\w)
。
如果你想找到所有长度为 64 的单词 from /path/to/file
,你可以使用
tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'
Run Code Online (Sandbox Code Playgroud)
这将用换行符替换所有非字母数字字符,因此每个单词都在自己的行上。然后过滤该结果以仅包含长度为 64 的单词。
如果您有 GNU grep
(Linux 上默认),您可以执行以下操作:
grep -Po '(^|\s)\S{64}(\s|$)' file
Run Code Online (Sandbox Code Playgroud)
启用-P
Perl 兼容正则表达式,它为我们提供\b
(字边界)\S
(非空白)和{N}
(精确查找 N 个字符),以及-o
“仅打印该行的匹配部分”的意思。然后,我们寻找非-的延伸。空格的长度正好是 64 个字符,位于行的开头 ( ^
) 或空格 ( 's
) 之后,并且位于行的末尾 ( $
) 或以另一个空格字符结束。
请注意,结果将包含字符串开头和结尾的任何空白字符,因此如果您想进一步解析它,您可能需要使用它:
grep -Po '(^|\s)\K\S{64}(?=\s|$)'
Run Code Online (Sandbox Code Playgroud)
这将查找空白字符或字符串的开头(\s|^)
,然后丢弃它\K
,然后查找 64 个非空白字符,后跟((?=foo)
称为“ lookahead ”并且不会包含在匹配中)空白字符,或行尾。