特定の長さのすべての文字列を解析しますか?

特定の長さのすべての文字列を解析しますか?

10年後のメールアーカイブをエクスポートしましたが、容量がかなり大きいです。

ビットコイン秘密鍵を取得するために、64文字の長さの文字列のすべてのテキストを解析したいと思います。

特定の長さの文字列を解析する方法は?

答え1

0-916進形式の256ビット数(範囲内の64文字 - ビットコイン秘密鍵に使用可能な形式の1つ)を検索する場合は、A-F次のことを行う必要があります。

egrep -aro '\<[A-F0-9]{64}\>' files and dirs ...

オプションを追加するか、一部のキーが小文字の場合は-i範囲​​も含めます。a-f

同じクラスで指定された長さの文字列を見つける一般的な問題の場合は、オプションでGNU grepで使用できるpcre regexpsを使用することをお勧めします-P。たとえば、最小長が 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Ó

小文字、スペース以外の文字など\p{Lu}に置き換えます。より\p{Ll}\Sここそしてここ完全なリストをチェックしてください。

(?<!...)そして(?!...)否定的な後ろを振り返って前を見て幅0たとえば、(?<!<)\w(?!>)andで囲まれていない場合、「単語」文字は一致します。幅0のアサーションは を介し​​て実装できます。<>\<vi(?<!\w)(?=\w)

答え2

長さ64のすべての単語を見つけるには、次のようにします/path/to/file

tr -c '[:alnum:]' '\n' < /path/to/file | grep '^.\{64\}$'

これにより、英数字以外のすべての文字が改行文字に変わり、各単語が1行に表示されます。その後、この結果をフィルタリングして、長さ64の単語のみを含めます。

答え3

GNU(Linuxのデフォルト)がある場合は、grep次のことができます。

grep -Po '(^|\s)\S{64}(\s|$)' file

(単語の境界)(スペースではなく)と(正確にN文字の検索)を提供し、「行の一致部分のみを印刷する」ことを意味する-PPerl互換正規表現を有効にします。次に、non-の拡張子を探します。スペースは正確に64文字の長さで、行の先頭()またはスペース()の後ろ、行の終わり()、または他のスペース文字で終わります。\b\S{N}-o^'s$

結果には文字列の先頭と末尾に空白文字が含まれているため、より詳細に解析するには次のようにします。

grep -Po '(^|\s)\K\S{64}(?=\s|$)'

これは空白文字または文字列の先頭を見つけ、(\s|^)それを破棄し、\K空白ではなく64文字を検索します(「と呼ばれる(?=foo)視野で、一致には空白文字や行末は含まれません。

答え4

grepは文字列を「検索」するのに適したツールのようです。今残っているのは、正規表現を使用してこれらの文字列を定義することです。最初の問題は、単語の範囲を定義することです。a book, a lamp単語区切り文字として使用される「スペース」ほど単純ではありません。,同じ概念では、他の多くの文字、さらに行の始まりまたは終わりも単語の区切り文字として機能することができます。 GNU grepにはいくつかの単語区切り記号があります。

  • \<馬が始まります。
  • \>単語の終わり。
  • \b単語の境界。

彼らはすべて単語が[a-zA-Z0-9_]一連の文字であると仮定します。よろしければ、次の正規表現が機能します。

 grep -o '\<.\{64\}\>' file

拡張正規表現が利用可能な場合は、以下を\減らすことができます。

 grep -oE '\<.{64}\>' file

単語の先頭(\<)、64({64})の文字( )から.単語の終わり(\>)から選択し、一致する-o部分()のみを印刷します。

ただし、 dot( .) は一致します。どの性格が多すぎるかもしれません。

より厳密に(16進数)選択するには、次のようにします。

 grep -oE '\<[0-9a-fA-F]{64}\>' file

これにより、小文字の16進数を使用できます。または首都。ただし、一部の非ASCII文字が含まれる可能性があるため、厳密に適用するには、以下を使用してください。

 LC_ALL=C grep -oE '\<[0-9a-fA-F]{64}\>' file

\<grep -P などの一部の grep 実装には、「単語の始まり」または「単語の終わり」(およびなど)がありませんが、\>「単語境界」(など\b)はあります。

grep -oP '\b[0-9a-fA-F]{64}\b' file

いくつかの言語があります。POSIXワード境界を許可します[[:<:]]が、[[:>:]]Perlは許可せず、PCRE 8.34でのみ許可します。

そして「単語の境界」にも様々なスタイルがあります。

関連情報