【问题标题】:replace a variable content with another variable content in a file using perl使用 perl 将一个变量内容替换为文件中的另一个变量内容
【发布时间】:2016-01-08 17:37:57
【问题描述】:

我正在编写一个 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!"

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

【问题讨论】:

  • perl 调用中有错误的引号?
  • 是的,它定义了 shell 变量但使用(未定义的)Perl 变量。
  • 您的代码有另一个问题:test.sh: line 4: (*(9*4000))+42: syntax error: operand expected (error token is "*(9*4000))+foo")$i 来自哪里?
  • 你说得对,“我”也不应该在那里。

标签: bash perl sh


【解决方案1】:

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

【讨论】:

  • 也可以在 perl 中进行数学运算
【解决方案2】:

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

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

双引号可防止可能的空格混淆您的命令。

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

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

【讨论】:

  • @ikegami:我在答案中使用了 sed(以标准方式将其与变量 shell 混合)。不同种族之间没有混合,所以你现在可以恢复一个点:)
  • 生成sed 代码的问题与生成 Perl 代码的问题相同。切换到sed,你就失去了使用\Q的能力,所以你实际上退了一步。但由于范围只是整数,所以这一切都没有实际意义,我将删除我的反对票、评论以及您因我的评论而进行的编辑。 (如果您真的想要,请随时将其切换回 sed
  • @ikegami:我基本同意你的看法,也感谢你让我发现\Q。 (很酷,您可以编辑每个帖子:)
猜你喜欢
  • 2019-05-08
  • 2016-07-09
  • 2012-03-30
  • 2015-11-04
  • 1970-01-01
  • 2011-12-21
  • 2012-10-16
  • 1970-01-01
  • 2017-05-25
相关资源
最近更新 更多