最初にn行のテキスト(nは<1000)、空の行、そして多くの型指定されていないバイナリデータを含む非常に大きなファイルを取得しました。
テキストの最初のn行を抽出してから、どういうわけかバイナリデータの正確なオフセットを抽出したいと思います。
最初の行の抽出は簡単ですが、どうすればオフセットを取得できますか?bashはエンコードを認識しないため、文字数を数えるだけでは意味がありません。
-b
grep には、バイト オフセットを出力するオプションがあります。
例:
$ hexdump -C foo
00000000 66 6f 6f 0a 0a 62 61 72 0a |foo..bar.|
00000009
$ grep -b "^$" foo
4:
$ hexdump -s 5 -C foo
00000005 62 61 72 0a |bar.|
00000009
最後のステップでは、改行をスキップするために 4 ではなく 5 を使用しました。
ファイル内のウムラウト (äöü) でも機能します。
grep
空の行を見つけるために使用します
grep -n "^$" your_file | tr -d ':'
オプションtail -n 1
で、最後の空行が必要な場合に使用します (つまり、バイナリの開始前にファイルの上部に空行を含めることができる場合)。
head
ファイルの先頭部分を取得するために使用します。
head -n $num
Perl はファイルのどこにいるかを教えてくれます:
pos=$( perl -le '
open $fh, "<", $ARGV[0];
$/ = ""; # read the file in "paragraphs"
$first_paragraph = <$fh>;
print tell($fh)
' filename )
括弧内に、私はこれをワンライナーしようとしていました
pos=$( perl -00 -lne 'if ($. == 2) {print tell(___what?___); exit}' filename
「現在のファイルハンドル」変数とは何ですか? ドキュメントで見つけられませんでした。