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