我在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字面上。
有什麼建議嗎?
如果是一些XML文件,最好使用XML解析器。在cpan上搜索XML – 2013-02-21 20:31:37
您可能想要學習一些不是15歲的Perl('/ o'從來沒有意義;'$ *'不再存在;裸號文件句柄從5.6開始已經過時了;等等)。 – melpomene 2013-02-21 20:44:26
「它會在每行的末尾放置^ M個字符,除了我替換的字符」可能是你誤解了輸出。這很可能是其他線路已經有^女士,你只是沒有看到他們。 – melpomene 2013-02-21 20:45:43