効率的である必要があるため、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\" \"\"\"\"\"\"\"\"\" \"
否定的な LookBehind を使用してこれを達成できます。https://www.regular-expressions.info/lookaround.html