我在bash脚本中使用以下内容将字符串替换为文件内容:
readonly changes=`cat changes.txt`
perl -pi -e 's/\${changesMarker}/'"$changes"'/g' changelog_template.html
文件“changes.txt”包含几行HTML。没什么特别的,只是一个无序列表,包括< UL>打开和关闭标签以及< LI>标签
Perl一直告诉我:
Illegal division by zero at -e line 1, <> line 1.
我猜Perl正试图评估替换文本?我该如何解决这个问题?
文件changelog_template.html是这样的:
<html>
<body>
What's changed:
${changesMarker}
</body>
</html>
文件changes.txt是这样的:
<ul>
<li>Fixed unicode error</li>
</ul>
答案 0 :(得分:2)
使用您的解决方案可以解决这个问题。但是,如果您的文字发生变化,我建议您不要使用它。假设单引号阻止了shell插值,你可以放弃这样做:
readonly changes=`cat changes.txt`
perl -pi -e 's/\${changesMarker}/$ENV{changes}/g' changelog_template.html
从技术上讲,您可以将其替换为:
perl -0777 -pie 'BEGIN { local @ARGV = shift; $changes = <>; }
s/\${changesMarker}/$changes/g;' changes.txt changelog_template.html
哪个会破坏文件,哪个更好,因为它允许多行匹配(理论上)。
这是一个足够简单的Perl脚本:
use strict;
use warnings;
undef $/;
open my $in, "<", shift or die "Cannot open input file: $!";
my $changes = <$in>;
while (<>) {
s/\${changesMarker}/$changes/g;
print;
}
像这样使用:
perl -pi script.pl changes.txt changelog_template.html
答案 1 :(得分:2)
您已将字符串转换为shell文字,但您未能首先将其转换为Perl代码。
例如,如果$changes
的内容为<b>foo</b>
,则表示您将以下程序传递给Perl:
s/\${changesMarker}/<b>foo</b>/g
^
|
Ends the substitution operator
我的建议是避免生成Perl代码。将字符串作为参数传递
perl -i -pe'
BEGIN { $replacement = shift(@ARGV) }
s/\${changesMarker}/$replacement/g
' "$change" changelog_template.html
或作为环境变量。
REPLACEMENT="$changes" \
perl -i -pe's/\${changesMarker}/$ENV{REPLACEMENT}/g' \
changelog_template.html