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

関連情報