【发布时间】:2014-12-08 17:59:15
【问题描述】:
我在 bash 脚本中使用以下内容将字符串替换为文件的内容:
readonly changes=`cat changes.txt`
perl -pi -e 's/\${changesMarker}/'"$changes"'/g' changelog_template.html
文件“changes.txt”包含几行 HTML。没什么特别的,只是一个无序列表,包括
- 打开和关闭标签以及
- 标签。
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>
【问题讨论】:
-
您使用 bash 脚本只是为了将文件的内容读入 shell 变量。为什么不将所有代码都放在 Perl 脚本中,而不必为了规避插值之类的事情而费尽心思?
-
试试这个“s/${changes}/$changes/g”
-
您还应该提供一些示例输入和输出。现在看起来您正在尝试将字符串
${changeMarker}(或一些未在任何地方初始化的同名变量)更改为文件中包含的任何内容,并用单引号和双引号括起来。至少可以说是非常奇怪和令人困惑的。或者,出于某种原因,您正试图用自己替换相同的字符串。所以,请澄清你的意图。 -
@SteveMcLeod 这无关紧要。将所有代码封装在一个脚本中仍然更容易。然后,您可以根据需要在 bash 脚本中使用该脚本:
perl script.pl build/changes.txt changelog_template.html -
让我举一个例子来说明这个任务带来的困难。如果您的“标记”包含正则表达式元字符、斜杠或美元符号怎么办? Shell 将首先尝试对它进行插值,然后是 Perl,然后您将面临一项噩梦般的任务,该任务很容易出现错误并且非常难以维护。