grep -ao ...word file.bin
私はしばしばテキストコンテンツ(「単語」)とその前にあるいくつかの注意事項を見つけるために使用します。
-a, --text
Process a binary file as if it were text; this is equivalent to the --binary-files=text option.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate
output line.
そうですね。さて、次のように動作することに気づきました。まず、文字列war
とその前にある1つの文字を見つけようとします。
$ grep -ao .war myfile.zip
/war
9war
$war
ʆwar
さて、ここで4回のクリックが発生しました。文字列war
とその前の2文字を見つけるには、次の手順を実行します。
$ grep -ao ..war myfile.zip
>$war
では、どのような理由であるのか、結果は1つだけ表示されますか? !
私の考えでは、3つが欠落している場合、「最初の2文字」の値は0x00(C文字列の終わり)なので、対応する一致は出力grep
されません。そうでなければ、まだ4つの結果が出ると予想されます(たとえば、前の最初の一致はファイルの先頭にあります。そうしないと、3つの結果が得られます)。
grep
マッチ項目のnullバイトを単に「無視」(またはドットなどに置き換える)し、それを含む可能性のあるマッチングを印刷し続けるように説得できますか?それ以外の場合は、grep
これを実行できる他のツールはありますか?
ベストアンサー1
あなたのアプローチには少なくとも2つ(好ましくは3つ)の問題があります。
non-standard を使用してもラインベース-o
ですgrep
。各行の出力に一致するすべての項目を見つけるためですo
。これは、改行で区切られた文字シーケンスです(ASCIIベースのシステムでは、値が10/0x0aのバイト)。
だから:
grep -o ..war
war
2 以降のインスタンスのみが返されます。数値(ここでは3つの問題の1つであるバイトではありません)改行を除いて。
たとえば、同様の入力では、<0x0a>Xwar
0x0aバイトは前の行を区別し、次の行は以前に1文字しかなかったXwar
ところから始まりますwar
。
UTF-8ロケールでは、同様の入力で<0xff><0xc3><0xa9>war
2バイトが文字を<0xc3><0xa9>
形成しますé
が、前の0xffバイトは無効であるため、文字を形成できません。
grep
grep
通常、テキストでのみ機能するため、実装によっては NUL 文字や過度に長い行や改行で終わらない入力で作業すると問題が発生する可能性があります。
その後でxxwarwar
見つかりますgrep -o
がxxwar
、より多くの一致の検索が続くため、見つかりませんarwar
。
これらの問題は、次の方法を使用して解決できますperl
。
perl -l -0777 -ne 'print "$1$2" while m{(?<=(..))(war)}sg'
war
インスタンスの前の 2 バイト (ユーザーロケールの文字ではない) を探し、入力消費を防ぐためにこれらの前のバイトに逆方向演算子を使用します。レコード区切り文字を不可能に設定するを使用して、-0777
入力の各行ではなく入力全体を処理します。