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
您不想使用e
perl 运算符的标志s///
。-e
将替换的右侧计算为 perl 代码;您不想评估cat $i
perl 代码的内容,您希望将其视为要替换的文字文本。由于您在 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%
的文本将被文件数组中第一个文件的内容替换,然后其余文件都不会替换任何内容。目前尚不清楚您到底想在这里做什么。使用-pi
perl 的标志,您可以告诉它内联编辑命令行上给出的任何/所有文件,目前只有$OUTPUT_PATH
.
这也可能是一种进行字符串替换的糟糕方法 - 每个文件的内容中可能有任意数量的字符,$i
可能会完全破坏您的 perl 命令行。单个/
字符就足以导致 Perl 语法错误,并且可能存在通过注入运行任意代码的序列。你已被警告过。