使用perl将文件中的变量内容替换为另一个变量内容

replace a variable content with another variable content in a file using perl

我正在编写一个 shell 脚本来替换一个整数变量内容,在 shell 脚本中使用 perl。

#!/bin/sh

InitialFileStep=""
CurrentStage=$((($i*(9*4000))+$InitialFileStep))
PreviousStage=$((($(($(($i-1))*(9*4000)))) + (InitialFileStep)))

perl -pi -e 's/$PreviousStage/$CurrentStage/g' file.txt
echo "Hey!"

似乎无法在文件中找到变量内容。 我不知道是什么问题,是因为变量是整数而不是字符串吗?

shell 不解释单引号内的任何内容。 '$ThisIsASimpleStringForTheShell' 所以尝试:

perl -pi -e 's/'"$PreviousStage"'/'"$CurrentStage"'/g' file.txt

双引号防止可能的空格弄乱你的命令。

混合使用单引号和双引号使您可以在命令中添加正则表达式运算符,从而防止 shell 在 perl 之前解释它们。此命令仅当 $PreviousStage 的内容单独出现在一行中时,才将 $PreviousStage 的内容替换为 $CurrentStage 的内容:

perl -pi -e 's/^'"$PreviousStage"'$/'"$CurrentStage"'/g' file.txt

变量只存在于您的shell脚本中;你不能直接在你的 Perl 脚本中使用它们。

我讨厌尝试从 shell 生成 Perl 代码,就像以前的解决方案所建议的那样。疯狂就在于此(尽管它在这里起作用,因为您只是在处理整数)。相反,将值作为参数或其他方式传递。

perl -i -pe'BEGIN { $S = shift; $R = shift; } s/\Q$S/$R/g' \
   "$PreviousStage" "$CurrentStage" file.txt

export PreviousStage
export CurrentStage
perl -i -pe's/\Q$ENV{PreviousStage}/$ENV{CurrentStage}/g' file.txt

S="$PreviousStage" R="$CurrentStage" perl -i -pe's/\Q$ENV{S}/$ENV{R}/g' file.txt