为什么双引号的转义在这种情况下会丢失?

$ cat foo.txt
This is a \"very good\" text worth AMOUNT dollars
$ cat full_story.txt
This is about money:
STORY

用以下方法测试:
VAR=$(cat foo.txt)
TOTAL=$(cat full_story.txt)
echo "$TOTAL" | perl -pe "s/STORY/$VAR/g"

结果:
This is about money:
This is a "very good" text worth AMOUNT dollars

双引号的转义丢失了。我在期待:
This is about money:
This is a \"very good\" text worth AMOUNT dollars

我怎样才能保存这些逃犯?

最佳答案

您的代码有一个code injection错误。具体地说,您试图从shell生成Perl代码,但失败了。
您正在将以下内容传递给Perl:

s/STORY/This is a \"very good\" text worth AMOUNT dollars/g

你应该通过下列考试:
s/STORY/This is a \\"very good\\" text worth AMOUNT dollars/g

要正确生成Perl代码,您需要如下内容:
perl -pe's/STORY/'"$( printf %s "$VAR" | sed 's/\W/\\&/g' )"'/'

这会将以下内容传递给Perl(这也很好):
s/STORY/This is a \\\"very good\\\" text worth AMOUNT dollars/g

不过,首先避免生成Perl代码要简单得多。在不使用STDIN或外部存储器的情况下,向Perl传递信息有三种主要方式。
论据
perl -pe'BEGIN { $VAR = shift(@ARGV) } s/STORY/$VAR/g' -- "$VAR"

命令行选项
在一个完整的程序中,您可以使用Getopt::Long,但是perl -s在这里会做得很好。
perl -spe's/STORY/$VAR/g' -- -VAR="$VAR"

环境变量
VAR="$VAR" perl -pe's/STORY/$ENV{VAR}/g'

08-05 19:55
查看更多