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

时间:2015-10-11 02:04:12

标签: bash perl sh

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

#!/bin/sh

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

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

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

2 个答案:

答案 0 :(得分:2)

变量只存在于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

答案 1 :(得分:1)

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

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

双引号可以防止可能的空格搞乱您的命令。

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

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