我在Linux主机上有一个目录,其中有几个属性文件,我想通过用占位符标记替换硬编码值来编辑这些文件。我的目标是有一个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字面意思。
有什么建议吗?
答案 0 :(得分:0)
我的输出如下所示。它把我希望的新行作为文字\ n
为什么在字符串不包含换行符时会插入换行符?
我找不到将\ n作为换行符的方法。
没有。如果要替换换行符,则需要提供换行符。
如果您使用了正确的CSV解析器,例如Text :: CSV_XS,则可以在数据文件中添加换行符。
否则,您将不得不编写一些代码来处理您希望代码处理的转义序列。
由于某种原因,它将^ M个字符放在每行的末尾,除了我替换的那个。
恰恰相反。它会从您替换的一行中删除它。
这是家里的一些程序代表回程。你有一个CR LF行结束的文件。您可以使用dos2unix
进行转换,也可以保留原样,因为XML并不关心。