Perl 多行查找和替换,无法让换行符工作



我在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

我的输出如下所示。它将我希望的换行符作为文字

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

我找不到将作为换行符的方法。一开始我想,没问题,我会像一样做第二次换人

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

虽然这是有效的,但出于某种原因,它在每一行的末尾都放了^M个字符,除了我替换的那一行。我不想做第三次替换来把它们去掉。

我已经搜索并找到了其他进行多行搜索/替换的方法,但它们都从字面上解释了。

有什么建议吗?

我的输出如下所示。它将我希望的换行符作为文字

当字符串不包含换行符时,为什么要插入换行符?

我找不到将作为换行符的方法。

没有。如果要替换换行符,则需要提供换行符。

如果使用适当的CSV解析器,如Text::CSV_XS,则可以在数据文件中放入换行符。

否则,您将不得不编写一些代码来处理您希望代码处理的转义序列。

出于某种原因,它在每行的末尾都放了^M个字符,除了我在上替换的那个字符

恰恰相反。它将它从你更换的一行中删除。

这就是家,有些程序代表回车。您有一个以CR LF结尾的文件。您可以使用dos2unix来转换它,也可以保持原样,因为XML不在乎。

最新更新