perl多行查找和替换,可以';我不能让新线工作

perl多行查找和替换,可以';我不能让新线工作,perl,Perl,我在Linux主机上有一个目录,其中有几个属性文件,我想通过用占位符标记替换硬编码的值来编辑这些文件。我的目标是有一个perl脚本,它读取一个分隔文件,该文件包含每个属性文件的条目,列出硬编码值、占位符值和要编辑的文件名 例如,在file.prop中,我设置了这些值 <connection targetHostUrl="99.99.99.99" targetHostPort="9999" 虽然这是可行的,但出于某种原

我在Linux主机上有一个目录,其中有几个属性文件,我想通过用占位符标记替换硬编码的值来编辑这些文件。我的目标是有一个perl脚本,它读取一个分隔文件,该文件包含每个属性文件的条目,列出硬编码值、占位符值和要编辑的文件名

例如,在file.prop中,我设置了这些值

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

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

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

有什么建议吗

我的输出如下所示。它将我希望的新行作为文字\n

<connection targetHostUrl="TARGETHOST"\n targetHostPort="PORT"
当字符串不包含换行符时,为什么要插入换行符

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

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

如果使用合适的CSV解析器(如Text::csvxs),可以在数据文件中添加换行符

否则,您必须编写一些代码来处理希望代码处理的转义序列


出于某种原因,它会在每一行的末尾添加^M个字符,但我替换的那一行除外

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


那是家,有些程序代表回车。您有一个以CR LF行结尾的文件。您可以使用
dos2unix
对其进行转换,也可以将其保持原样,因为XML不关心它。

如果是一些XML文件,最好使用XML解析器。在CPA上搜索XML您可能想学习一些不到15年的Perl(那些
/o
从来没有意义;
$*
已经不存在了;从5.6开始,裸字文件句柄就已经过时了;等等)。“它在每行末尾都放^M个字符,除了我替换的字符之外”可能是您误解了输出。很可能其他行已经有^Ms,而您只是看不到它们。sputnick-我只是觉得在这种情况下xml解析器的功能太过强大了,如果可能的话,我想对所有文件类型使用相同的脚本。melpomene-是的,我可以使用/g而不是/o,但因为只有当我不使用/g时,条目才会存在。该文件中没有^M个字符,它是Unix格式,在替换之前在vi中查看时,没有^M个字符。只有在尝试用换行符替换\n之后,它们才会显示在所有其他行中。我要找的正是您所说的“一些处理转义序列的代码”
#!/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