ジャンル不定の日記です。

Perlでファイルの部分置換ってどうやるんだ?

前にSC-02Cのi9100用ROMのGPS対応させる方法で、
変更箇所を探して置換するPerlスクリプトを作ろうとしたら、
Perlでseekしてprintすると置換じゃなくて挿入になっちゃうんで、そこまで必要も感じてなかったから放置してた。

で、ddコマンドで部分書き込みしたら特定部分だけ置換できるよね?
って思ったので、ちょっとやってみた。
$ system("echo -en '\xFC' | dd of=file conv=notrunc bs=1 seek=$p[$i]");
こんな感じでechoの出力をパイプでddに渡してやった。
普通に目的の位置だけ置換できた。
$p[$i]が目的のアドレス。
echoで-enすると、eでエスケープシーケンスを出力できるのでバイナリ出力ができる。nは改行出力をしない。
ddはifがなければ標準出力から入力になるのでパイプで渡せる。conv=notruncしないと書き込み位置より後ろが消えちゃうらしい。

あと、
$ cmp -l file1 file2
で2ファイルの違う位置を10進で出力。
目的箇所以外変わってない。