【问题标题】:Perl search and replace in a Shell scriptPerl 在 Shell 脚本中搜索和替换
【发布时间】:2020-04-29 02:04:41
【问题描述】:

我一直在尝试使用 shell 脚本和 perl 替换 .txt 文件中的一些文本。

oldKey=123
trimmedNewKey=456

#Export shell variables, so that they can be used by perl
export oldKey
export trimmedNewKey

#Search and Replace
perl -pi -e 's/$ENV{oldKey}/$ENV{trimmedNewKey}/g' AppConstants.txt

这失败了,但另一方面,如果我直接使用字符串作为搜索参数,它可以工作:

perl -pi -e 's/123/$ENV{trimmedNewKey}/g' AppConstants.txt.

我不是壳牌专家,无法弄清楚为什么我的“搜索”参数无法通过变量进行评估。救命!

【问题讨论】:

  • 您声称产生不同结果的两个 sn-ps 实际上是等效的,除了文件名不同(AppConstants.txt vs AppConstants.txt.)假设这不是您的意思,请提供实际演示根据需要解决问题。
  • oldKey 的值是否应该按字面意思匹配,还是正则表达式模式?如果是前者,你应该使用s/\Q$ENV{oldKey}/.../g
  • 您的代码在这里可以正常工作,请举例说明输入文件和预期输出
  • @ikegami 这成功了。您能否将其添加为答案,并对 \Q 进行一些解释。我一直认为我们必须在搜索模式中提供一个字符串,无论是正则表达式还是文字。
  • 你总是必须提供一个正则表达式模式,无论它是一个编译的正则表达式对象(来自qr//)还是一个字符串。 (其他任何内容都会被字符串化。)

标签: bash shell perl


【解决方案1】:

尝试将您的代码更改为

oldKey=123
trimmedNewKey=456
perl -pi -e "s/$oldKey/$trimmedNewKey/g" AppConstants.txt

这应该可行,因为在单引号括起来的字符串中,没有变量和通配符扩展,就像在双引号括起来的字符串中一样。

也许可以将一些变量传递给 perl,以便在 perl 程序内部进行扩展,但是当您可以用更简单的方式解决它时,为什么要让它变得复杂呢?

【讨论】:

  • 如果你使用 sed 而不是 perl 可能会更快,如下:sed -i "s/$oldKey/$trimmedNewKey/g" AppConstants.txt
  • 这是一个可怕的想法。您刚刚添加了许多错误而没有修复任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多