2013-02-21 33 views
0

我在Linux主機上有一個目錄,其中有幾個屬性文件,我想通過用佔位符標籤替換硬編碼值來編輯這些文件。我的目標是有一個perl腳本,它讀取一個分隔文件,其中包含每個屬性文件的條目,列出硬編碼值,佔位符值和要編輯的文件的名稱。perl多行查找和替換,無法獲得換行

例如,在file.prop我的這些值設置

  <connection targetHostUrl="99.99.99.99" 
         targetHostPort="9999" 

而且我想,以取代變量的數值如下圖所示

  <connection targetHostUrl="TARGETHOST" 
         targetHostPort="PORT" 

類似這樣會有幾個條目所以我必須匹配IP和PORT的獨特組合,所以我需要一個多行匹配。

爲此,我編寫了以下腳本來接受用||分隔的分隔文件名的輸入。我從config目錄中獲取該文件並讀取值以獲取要編輯的硬編碼值,標記和文件名。然後我讀入該屬性文件,進行替換,然後再寫出來。

#!/usr/bin/perl 
my $config = $ARGV[0]; 
chomp $config; 
my $filename = '/config/' . $config; 
my ($hard,$tagg,$prop); 
open(DATAFILE, $filename) or die "Could not open DATAFILE $filename."; 
while(<DATAFILE>) 
{ 
    chomp $_; 
    ($hard,$tagg,$prop) = split('\|\|', $_); 
$*=1; 
open(INPUT,"</properties/$prop") or die "Could not open INPUT $prop."; 
@input_array=<INPUT>; 
close(INPUT); 
$input_scalar=join("",@input_array); 
$input_scalar =~ s/$hard/$tagg/; 
open(OUTPUT,">/properties/$prop") or die "Could not open OUTPUT $prop."; 
print(OUTPUT $input_scalar); 
close(OUTPUT); 
} 
close DATAFILE; 

裏面的配置文件我有以下的條目

<connection targetHostUrl="99.99.999.99"(.|\n)*?targetHostPort="9999"||<connection targetHostUrl="TARGETHOST1"\n targetHostPort="PORT"||file.prop 

我的輸出,如下圖所示。它把我的希望是一個換行符作爲文字\ n

<connection targetHostUrl="TARGETHOST"\n targetHostPort="PORT" 

我不能找到一個辦法讓\ n作爲換行符。起初我以爲,沒有問題,我只是做了第二個替代像

perl -i -pe 's/\\n/\n/o' $prop 

,雖然這個工程,由於某種原因,它把^ M字在每一行,除了一個我做了更換結束上。我不想做第三次替換將它們除去。

我已經搜索並找到其他方式做多行搜索/替換,但他們都解釋\ n字面上。

有什麼建議嗎?

+1

如果是一些XML文件,最好使用XML解析器。在cpan上搜索XML – 2013-02-21 20:31:37

+2

您可能想要學習一些不是15歲的Perl('/ o'從來沒有意義;'$ *'不再存在;裸號文件句柄從5.6開始已經過時了;等等)。 – melpomene 2013-02-21 20:44:26

+0

「它會在每行的末尾放置^ M個字符,除了我替換的字符」可能是你誤解了輸出。這很可能是其他線路已經有^女士,你只是沒有看到他們。 – melpomene 2013-02-21 20:45:43

回答

0

我的輸出如下所示。它把我希望成爲一個新行作爲一個字面\ n

爲什麼它會插入一個換行符時,該字符串不包含一個?

我找不到一種方法將\ n作爲換行符。

沒有。如果你想替換一個換行符,你需要提供一個換行符。

如果您使用了正確的CSV解析器(如Text :: CSV_XS),則可以在數據文件中放入換行符。

否則,您將不得不編寫一些代碼來處理您希望代碼處理的轉義序列。

由於某些原因,它會在每行的結尾放置^ M個字符,除了我替換的字符之外。

恰恰相反。它會從您替換的一行中刪除它。

這是家裏的一些程序代表回車。你有一個CR LF行結束的文件。你可以使用dos2unix來轉換它,或者你可以保持原樣,因爲XML不關心。

+0

我在找的正是你所說的 - 「處理轉義序列的一些代碼」 – user2096956 2013-02-22 23:53:25