2013-12-21 77 views
1

我有10行文本文件。每一行都有no_access這個詞,並且只有它。我發現一個網站有語法來替換每一個字符串的第n次出現。當我嘗試將其寫入腳本時,它會吐出錯誤。用Perl腳本代替每隔n次發生

Replace every Nth occurrence

這是劇本我到目前爲止有:

use strict; 
use warnings; 

while (<>) { 
my $count = 0; 
s/no_access/(++$count % 3 == 0)?"read":$&/ge; 
} 
print; 

但是,我得到的錯誤:未初始化值$ _打印使用。

我試過的腳本,而不將打印命令,但沒有任何反應。我如何讓這個腳本運行並執行每第三個「no_access」的替換。

+0

問:你怎麼調用這個腳本?我沒有看到文件名參數。而且,腳本不會更改文件,即使它在文件上循環。 – jsplaine

+0

我今天剛開始使用Perl。我是從這個問題的工作: http://stackoverflow.com/questions/10153302/perl-replace-every-nth-and-multiples-occurrences-of-a-character-with-another –

+0

我打電話腳本如下所示:perl Script.pl TextFile.txt –

回答

4

這裏的另一種選擇:

use strict; 
use warnings; 

my $i = 0; 
my $n = 3; 

while (<>) { 
    s/no_access/read/ if !(++$i % $n); 
    print; 
} 

用法:perl script.pl inFile [>outFile]

最後,可選參數輸出定向到一個文件中。

希望這會有所幫助!

+2

+1或者這個:'s/no_access/read /除非++ $ i%$ n'。 – FMc

+0

@FMc - 是 - 很好的選擇添加! – Kenosis

+0

不知道我知道如何翻譯「除非++ $ i%$ n」。除非沒有餘數,這是否意味着替換? –

3

你的代碼幾乎是正確的,只是移動while循環外的變量聲明,以及裏面的打印:

use strict; 
use warnings; 

my $count = 0; 
while (<>) { 
     s/no_access/(++$count % 3 == 0)?"read":$&/ge; 
     print; 
} 

然後從標準輸入並打印讀取到stdout,改變每3出現,只要你想它至。

如果你想讀的文件,更改其內容,然後重新寫出來,你的代碼看起來是這樣的:

use strict; 
use warnings; 

my $file = $ARGV[0]; 
die "usage: $0 <filename>" unless defined $file; 
open(IN, "<$file") or die "Can't read $file: $!"; 
my $count = 0; 
my $out = ""; 
while (<IN>) { 
     s/no_access/(++$count % 3 == 0)?"read":$&/ge; 
     $out .= $_; 
} 
close(IN); 
open(OUT, ">$file") or die "Can't write $file: $!"; 
print OUT $out; 
close(OUT); 
+0

將結果輸出到命令行。我如何得到結果在文本文件中進行替換? –

+0

沒有「到位」替換。您可以編寫新文件,然後以各種方式將其名稱更改爲舊名稱;或者您可以讀取整個文件,然後再次打開以便寫入。我會更新我的答案以顯示如何。 –