0

hexdump状況は次のとおりです。文字列 A と文字列 B の間のバイトからの出力を見つける必要があります。16 進ダンプの構造は次のようなものです。

-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes

そして今、質問: - 「A から B へ」grep することは可能ですか? マニュアルページやインターネットでそのようなものを見たことがありません。手動で実行できることはわかっていますが、スクリプトを作成する必要があります。- 行番号なしで hexdump 出力を表示することは可能ですか? それは非常に合理的なようですが、私はそれを行う方法を見つけていません。

ありがとう!

4

2 に答える 2

1

Perl のようなルックアラウンド アサーションを使用して、A と B を除く、A と B の間のすべてを一致させることができます。

$ echo 'TEST test A foo bar B test' | grep -oP '(?<=A).*(?=B)'
 foo bar 

ただし、Michael の回答を考慮に入れると、hexdump出力を単一の文字列に変換して使用する必要がありますgrep。途中で「行番号」を取り除くことができます:

hexdump filename | sed -r 's/\S{5,}//g' | tr '\n' ' '

またはそれ以上

hexdump filename | cut -d ' ' -f 2- | tr '\n' ' '

これですべてが 1 行にまとめられたのでgrep、貪欲ではなく、怠惰でなければなりません。

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP '(?<=A).*?(?=B)'
 foo bar 
 bar foo 

しかし、Michael は言いたいことを言っています。少なくとも複数回実行する必要がある場合は、もっと高レベルのものを使用する必要があるかもしれません。

PS 試合に A と B を含めても問題ない場合は、そのまま実行してください

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP 'A.*?B'
A foo bar B
A bar foo B
于 2012-05-08T17:59:31.413 に答える
0

grepプログラムは一度に1行でのみ機能します。16進ダンプでインテリジェントに動作させることはできません。

私の提案:perl、ruby、またはお気に入りのスクリプト言語の正規表現機能を使用して、文字列の生のバイナリデータをgrepします。ルビーのこの例:

ARGF.read.force_encoding("BINARY").scan(/STR1(.*?)STR2/);

これにより、STR1とSTR2のオカレンス間のすべてのバイナリ文字列を含む配列が生成されます。そこから、それぞれを実行できますhexdump(1)

于 2012-05-08T17:48:28.820 に答える