2012-09-16 41 views
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然后用FUDIK在现场代替JAMES 7

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

我希望在这个

+1

除非新字段的大小与前一字段完全相同,否则无法避免重写该文件,如果这是您的意图,请使用数据库。 – Thor

+0

@Thor下面的答案来自于TLP无论字段大小如何都可以工作 – Chkusi

+1

'-i'开关可以在原地表示,但在后台使用临时文件,请参阅'perlrun(1)'。 – Thor

回答

3

任何帮助这是一个Perl的一行:

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

-i将选项进行就地编辑。您可能希望限制的替代,以避免部分匹配,如:

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

或者你可以用它代替-p-n开关和做

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

你应该知道,这就地编辑实际上是在写一个新文件,然后复制旧文件。如果你想避免这种情况,你需要做一些严肃的杂耍,并可能在写作时锁定文件。

+0

感谢您的回答。不过,我试过上面的命令,这是消失的文件内容,并使其零字节。 – Chkusi

+0

@Chkusi该命令没有办法截断你的文件。如果字段8是罗伯特,它将只影响*您的文件,然后只将JAMES更改为FUDIK。 – TLP

+0

文件未被修改。我通过回答这个问题显示日志。 – Chkusi

相关问题