1

同じファイル内の別の列の値に基づいて、その場でファイルを編集(列の値に置き換え)したい。置換後に出力を別のファイルにリダイレクトしたくはありませんが、ファイルをその場で編集したいと思います。特にこれが必要なのは、編集が必要なファイルは、どのプログラムからも同時にアクセスされることはなく、インプレース編集が必要だからです。

以下のコードを試してみました。しかし、これも入力ファイルに1行ずつ書き込んでいます

#!/usr/bin/perl -w

open(FILEIN, "/dummy/chaat/h2") || die("Cannot open file");
@file = <FILEIN>;
seek FILEIN, 0, 0;

foreach $file (@file) {
    @field = split(/\|/, $file);
    print $field[8] . "\n";
    if ($field[8] eq "ROBERT") {
        $file =~ s/JAMES/FUDIK/g;
        print FILEIN $file;
    }
}

私のサンプルレコードは以下のとおりです。ここでこれをインライン編集したいと思います。フィールド8がROBERTの場合、フィールド7でJAMESをFUDIKに置き換えます。

Change|sinmg|ewfewf|ewfew|def|fdfd|JAMES|rewr|ROBERT|dsf|fe
Change|sinmg|ewfewf|ewfew|def|JAMES|fewf|rewr|BEASLEY|dsf|fe

これについて助けていただければ幸いです

4

1 に答える 1

3

これはperlのワンライナーです:

perl -F'\|' -i -lape 'if ($F[8] eq "ROBERT") { s/JAMES/FUDIK/g }' /dummy/chaat/h2

この-iオプションは、インプレース編集を行います。部分一致を回避するために、置換を制限することをお勧めします。例:

s/(?<=\|)JAMES(?=\|)/FUDIK/g

または、-n代わりにスイッチを使用して実行することもでき-pます

s/JAMES/FUDIK/g for @F } print join "|", @F;

このインプレース編集は、実際には新しいファイルを書き込み、古いファイルをコピーしていることに注意してください。これを避けたい場合は、深刻なジャグリングを行う必要があり、書き込み中にファイルをロックする可能性があります。

于 2012-09-16T19:39:59.167 に答える