我必须保持高效,所以我不能使用类似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