如何编写例程来转义 JSON 字符串中的双引号

如何编写例程来转义 JSON 字符串中的双引号

我必须保持高效,所以我不能使用类似jq加载大型二进制可执行文件的工具。我只是想转义字符串中的双引号,这样对于 JSON 来说是安全的。这还不够好:

echo ' bad \"  string"' | sed 's/"/\\"/g' 

因为它会转义已经转义的双引号。有没有办法仅在双引号尚未转义时替换它们?

答案1

想必您只想转义,"除非它前面有\.

echo ' bad \"  string"' | sed -E 's/([^\]|^)"/\1\\"/g'

解释

这将匹配",但前提是它前面是[^\],即“除\”之外的任何字符(或行的开头^)。但是,由于这个新字符将被自身替换,因此我们需要将其捕获到捕获组中(),然后再次用匹配项替换它\1。在此示例中,为了简单起见,我使用了扩展正则表达式-E

答案2

$ echo ' bad \"  string"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\"
$ echo ' bad \"  string" """""""""' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\"
$ echo ' bad \"  string" """"""""" \"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\" \"

使用负向后看,您可以实现这一点。https://www.regular-expressions.info/lookaround.html

相关内容