为什么在这种情况下双引号的转义会丢失?
$ 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
如何保留转义符?
最佳答案
问题是 perl
在显式替换字符串(不是 perl
变量)中解析反斜杠转义,因此 \"
是解析为”
。例如:
$ echo "A STORY" | perl -pe 's/STORY/\"Hello\"/'
A "Hello"
(请注意,Bash 变量 $VAR
不会变成 perl
变量 $VAR
,而是一个常量字符串。)所以你需要像这样在常量字符串中转义反斜杠:
$ echo "A STORY" | perl -pe 's/STORY/\\"Hello\\"/'
A \"Hello\"
您可以通过使用 -s
将 Bash 变量 $VAR
转移到 perl
变量 $VAR
来解决这个问题。像这样切换到 perl
:
echo "$TOTAL" | perl -spe 's/STORY/$VAR/g' -- -VAR="$VAR"
输出:
This is about money:
This is a \"very good\" text worth AMOUNT dollars
解释:
- -s 为
perl
命令行上的用户定义开关启用开关解析。从@ARGV
中找到的任何开关都会被删除,并在 Perl 程序中设置相应的变量。
关于regex - 为什么在此正则表达式替换中丢失引号转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52464789/