Perlでファイルの部分置換ってどうやるんだ?
前にSC-02Cのi9100用ROMのGPS対応させる方法で、
変更箇所を探して置換するPerlスクリプトを作ろうとしたら、
Perlでseekしてprintすると置換じゃなくて挿入になっちゃうんで、そこまで必要も感じてなかったから放置してた。
で、ddコマンドで部分書き込みしたら特定部分だけ置換できるよね?
って思ったので、ちょっとやってみた。
普通に目的の位置だけ置換できた。
$p[$i]が目的のアドレス。
echoで-enすると、eでエスケープシーケンスを出力できるのでバイナリ出力ができる。nは改行出力をしない。
ddはifがなければ標準出力から入力になるのでパイプで渡せる。conv=notruncしないと書き込み位置より後ろが消えちゃうらしい。
あと、
目的箇所以外変わってない。
変更箇所を探して置換する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進で出力。目的箇所以外変わってない。
そんな感じで目的の作業は自動化できそうだが、
Perlでファイルの部分置換ってどうやるんだ?
できないとも思わないんだが、標準関数じゃできないの?
Perlでファイルの部分置換ってどうやるんだ?
できないとも思わないんだが、標準関数じゃできないの?