2012-09-16 43 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

相關問題