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