使用 perl 将字符串替换为数组中找到的文件内容

使用 perl 将字符串替换为数组中找到的文件内容
for i in "${arrOfFiles[@]}"; do
   # OUTPUT_PATH=some dynamic naming file created earlier
   perl -pe 's/%REPLACE ME%/`cat $i`/ge' -i "$OUTPUT_PATH"`
done

我的脚本挂在这里并且永远不会完成。 usingcat $i显示了数组中文件的正确内容,因此 $i 正在工作。是什么赋予了?

答案1

您不想使用eperl 运算符的标志s///-e将替换的右侧计算为 perl 代码;您不想评估cat $iperl 代码的内容,您希望将其视为要替换的文字文本。由于您在 bash 命令行中使用单引号,因此cat $i文本会按字面意思传递给 perl 并评估为表达式: 这意味着 perl 运行一个子 shell,cat并且其内容(在 perl 看来)$i- 这不是珀尔根本没有变量。如果没有use strict,拥有未声明的变量是完全合法的,因此当您告诉 Perl 打开一个cat不带参数调用的子 shell 时,它不会抱怨。 cat当然,没有参数只是等待标准输入..这就是为什么你看到脚本“挂起”。你本质上是在调用这个:

perl -e '`cat $i`;'

use strict如果您将以下内容添加到 Perl 代码中,您的错误就会很明显:

perl -e 'use strict; `cat $i`;'

你的代码块应该是这样的:

for i in "${arrOfFiles[@]}"; do
    perl -pi -e "s/%REPLACE ME%/`cat $i`/g;" "$OUTPUT_PATH"
done

但请注意,这将始终对名为 in 的文件进行操作$OUTPUT_PATH,这意味着其中%REPLACE ME%的文本将被文件数组中第一个文件的内容替换,然后其余文件都不会替换任何内容。目前尚不清楚您到底想在这里做什么。使用-piperl 的标志,您可以告诉它内联编辑命令行上给出的任何/所有文件,目前只有$OUTPUT_PATH.

这也可能是一种进行字符串替换的糟糕方法 - 每个文件的内容中可能有任意数量的字符,$i可能会完全破坏您的 perl 命令行。单个/字符就足以导致 Perl 语法错误,并且可能存在通过注入运行任意代码的序列。你已被警告过。

相关内容