0

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

有什么建议么?

4

1 回答 1

0

我的输出如下图所示。它将我希望成为换行符的内容作为文字 \n

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

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

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

如果您使用了适当的 CSV 解析器,例如 Text::CSV_XS,您可以在数据文件中添加换行符。

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

出于某种原因,它会将 ^M 字符放在每一行的末尾,除了我进行替换的那一行。

恰恰相反。它将它从您进行替换的一行中删除。

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

于 2013-02-21T23:08:07.043 回答