効率化が必要なので、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