我想根据同一文件中另一列中的值编辑一个文件(替换列值)。我不想在替换后将输出重定向到另一个文件,而是想要在适当的位置编辑该文件。特别需要这个,因为需要编辑的文件将同时被任何程序访问,并且必须进行就地编辑
我试过下面的代码。但这又是逐行写入输入文件
#!/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中用FUDIK替换JAMES
Change|sinmg|ewfewf|ewfew|def|fdfd|JAMES|rewr|ROBERT|dsf|fe
Change|sinmg|ewfewf|ewfew|def|JAMES|fewf|rewr|BEASLEY|dsf|fe
我将不胜感激任何帮助
答案 0 :(得分:3)
这是一个perl one-liner:
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;
你应该知道这个就地编辑实际上是在写一个新文件,并复制旧文件。如果你想避免这种情况,你需要做一些严肃的杂耍,并可能在写作期间锁定文件。