2008-12-09 34 views
3

我的要求是將給定文本文件中的一組單詞替換爲第二組單詞,這些單詞可能來自命令行或其他文件。想用Perl來做到這一點,因爲我的代碼的其餘部分也在Perl中。如何用Perl中的另一組替換文件中的一組單詞?

所以,如果我有以下幾點:

server name="${server1}" host="abc.com" 
server name="${server2}" host="webcs.com" 
server name="${server5}" host="httpvcs1.com" 
server name="${server6}" host="xyz.com" 
server name="${server7}" host="msg.com" 

我希望替換字符串「server1的」,「服務器2」,「服務器5」等,用不同的詞的集合。這些可能被放置在另一個文件中或從命令行中給出(取其更可行)。另外,如果,而不是'server1','server2'等,我想用'文件'替換'服務器'這個詞,我將如何去做這個替換的正則表達式?

perl -pie 's/server\d{1-3}/myword/g' loginOut.txt > loginOut1.txt 

以上將替換所有帶'myword'的單詞。但我只想要替換子字符串。

+0

有犯規」似乎這裏是一個問題 - 你似乎回答了你自己的問題。 – 2008-12-09 04:34:57

+0

@Gortok:我希望替換一個子字符串,而我的查詢將替換整個單詞。 – gagneet 2008-12-09 04:43:36

+0

我不清楚你想要替換的字符串的哪一部分... – 2008-12-09 04:47:41

回答

0

你可能想嘗試Template Toolkit


下面是從模板工具包Intro, Manual page的摘錄:


模板工具包是其實現快速,靈活,功能強大且可擴展的模板處理系統的Perl模塊集合。它最常用於生成動態網頁內容,儘管它可以很好地用於處理任何類型的文本文檔。

在最簡單的級別上,它提供了一種簡單的方法來處理模板文件,使用它們的等效值填充嵌入式變量引用。這是一個模板的例子。

 
Dear [% name %], 

It has come to our attention that your account is in 
arrears to the sum of [% debt %]. 

Please settle your account before [% deadline %] or we 
will be forced to revoke your Licence to Thrill. 

The Management. 

默認情況下,模板指令被嵌入的字符中的序列[% ... %],但你可以改變這些和其他各種選項來配置模板工具包的外觀,感覺和作品。您可以設置INTERPOLATE選項,例如,如果你喜歡嵌入您的變量在Perl風格:

 
Dear $name, 

It has come to our attention that your account is in 
arrears to the sum of $debt. 

Perldoc page

0

你的正則表達式更改爲以下:

perl -pie 's/\{server/myword/g' loginOut.txt > loginOut1.txt 
2

你的第二個問題,正則表達式是s/server/myword/g;。這匹配(並替代)任何發生的「服務器」。

要更換服務器1,服務器等,使用不同的字符串每次,你可以有一個包含替換規則的文本文件,如:

server1 abcd 
server2 bcde 
server3 cdef 
etc. 

你會在隨後的日期從文件中讀取成散列,例如,

my %dict; 
while(<DICTFILE>){ 
    /(\S+)\s+(\S+)/; 
    $dict{$1}={$2}; 
} 

並繼續進行更換後:

while(my $line = <>){ 
    foreach my $s (keys %dict){ 
     $line =~ s/$s/$dict{$s}/g; 
    } 
    print $line; 
} 
1

以上所有答案都有一些缺陷。你問一些方式來

我想的東西,如 '文件1', '文件2', 'file5' 來代替 'server1的', '服務器2', '服務器5' 等..

的是,該命令(在Windows提示其-pe,不-pie):

perl -pe "s/\{server/\{file/g" in.txt > out.txt 

和out.txt是:

server name="${file1}" host="abc.com" 
server name="${file2}" host="webcs.com" 
server name="${file5}" host="httpvcs1.com" 
server name="${file6}" host="xyz.com" 
server name="${file7}" host="msg.com" 

我根據你最新的評論,相信這正是你想要的。

1

您只需要儘可能多地根據自己的情況使其獨特。

在這種情況下,你可以這樣做:

S/{服務器/ {文件/克;

0

嘗試以下操作:

$what = 'server'; # The word to be replaced 
$with = 'file'; # Replacement 
s/(?<=\${)$what(?=[^}]*})/$with/g; 
相關問題