次のファイルがあります。
i36aasf5i7538i123
i47982i16537i1256
i1647i6458i3457
i1856i8456i43865
各行の最初のiがoに変わるファイルをコピーしたいです。次に、編集したファイルを元のファイルに再度リンクしようとします(可能であれば出力ファイルを指定せず)。
したがって、出力は次のようになります。
i36aasf5i7538i123
i47982i16537i1256
i1647i6458i3457
i1856i8456i43865
o36aasf5i7538i123
o47982i16537i1256
o1647i6458i3457
o1856i8456i43865
私はそうするいくつかの単一のライナーを知っています。しかし、sedを使用すると、エンコードに問題が発生しました(ファイルに珍しい文字が含まれています)。 Perlを使用すると、この問題はありませんが、できるだけ「エレガントに」Perlスクリプトに統合する方法を探しています。
私はUnixオペレーティングシステムを使用しています。
ベストアンサー1
読み込んでいるファイルにデータを追加すると、以前に書き込んだデータを処理するため、無限ループに入ってファイルが永遠に大きくなる危険があります。
これによりこれを防ぐことができます。
perl -pe '
BEGIN{seek(STDOUT,0,2);$end = tell STDOUT}
last if tell(ARGV) > $end;
s/i/o/' < file >> file
Perlスクリプトでは:
open OUT, ">>", "file" or die "open file: $!";
open IN, "<", "file" or die "open file: $!";
seek(OUT,0,2) or die "seek: $!";
$end = tell OUT;
while (tell IN < $end && <IN>) {
s/i/o/;
print OUT $_;
}
close IN;
close OUT;