ファイルをコピーして文字を変更してリンクします。

ファイルをコピーして文字を変更してリンクします。

次のファイルがあります。

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;

おすすめ記事