解析所有特定长度的字符串?

Phi*_*ide 2 text-processing wildcards files pattern-matching

我已经导出了非常大的 10 年电子邮件存档。

我想解析任何长度为 64 个字符的字符串的所有文本以搜索比特币私钥。

如何解析特定长度的字符串?

piz*_*ect 7

如果您要找的是不是以十六进制形式(从范围为64个字符一个256位的数字0-9A-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)


Fox*_*Fox 6

如果你想找到所有长度为 64 的单词 from /path/to/file,你可以使用

tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'
Run Code Online (Sandbox Code Playgroud)

这将用换行符替换所有非字母数字字符,因此每个单词都在自己的行上。然后过滤该结果以仅包含长度为 64 的单词。


ter*_*don 5

如果您有 GNU grep(Linux 上默认),您可以执行以下操作:

grep -Po '(^|\s)\S{64}(\s|$)' file
Run Code Online (Sandbox Code Playgroud)

启用-PPerl 兼容正则表达式,它为我们提供\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 ”并且不会包含在匹配中)空白字符,或行尾。