使用Perl用多行HTML替换单行文本

时间:2014-12-08 17:59:16

标签: bash perl

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

2 个答案:

答案 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