regex - 为什么在此正则表达式替换中丢失引号转义?

标签 regex bash perl

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

$ 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

解释:

  • -sperl 命令行上的用户定义开关启用开关解析。从 @ARGV 中找到的任何开关都会被删除,并在 Perl 程序中设置相应的变量。

关于regex - 为什么在此正则表达式替换中丢失引号转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52464789/

相关文章:

c# - string.IndexOf 搜索全词匹配

c# - 使用 Regex.Match 静态方法查找从特定位置开始的匹配项

bash - 如何在 whiptail 中显示信息框?

bash - 如何将 Go cmd 应用程序提供为高效应用程序

perl - 为什么 Perl 的 bignum 模块会给我一个奇怪的幂计算结果?

linux - 如何检查 Perl 脚本是否正在终端中运行?

ruby - 在 Ruby Regex 中使用超过 9 个未命名的捕获

Java 用逗号或 0(零)后跟一个空格分割字符串

linux - 如何将用户输入与数组进行比较并执行命令?

apache - 在 Apache 下的 FastCGI 中使用 Catalyst 进行调度