bashでのエスケープ文字(JSONの場合)
git を使っていて、コミットメッセージとその他の部分を JSON ペイロードとしてサーバーに投稿しています。
現在、私は
MSG=`git log -n 1 --format=oneline | grep -o ' .\+'`
というようにMSGを設定しています。
Calendar can't go back past today
とすると
curl -i -X POST \
-H 'Accept: application/text' \
-H 'Content-type: application/json' \
-d "{'payload': {'message': '$MSG'}}" \
'https://example.com'
私の本当のJSONには、もう2つほどフィールドがあります。
これは問題なく動作しますが、もちろん上記のようなアポストロフィが含まれるコミットメッセージがある場合、JSONは無効となります。
bashで必要な文字をどのようにエスケープすればいいのでしょうか?私はこの言語に詳しくないので、どこから始めればいいのかわかりません。という文字を '
に置き換えることで、最低限のことはできるのではないかと思います。
50
3
私もJSONを使った転送のために、Bashで文字をエスケープしようとしていたときに、これに出会いました。特にフリーフォームのテキストを扱おうとしている場合、実際にはもっと大きなエスケープしなければならない文字のリスト – があることを知りました。
私が見つけた便利なTipsは2つあります。
${string//substring/replacement}
構文を使用する。その結果、私が思いついたBashの置換は以下の通りです。
この段階では、Unicode文字を正しくエスケープする方法はまだ分かっていません。もしこれがわかったら、私の答えを更新します。
OK、どうすればいいかわかったよ。Bashは予想通りネイティブにサポートしていますが、いつものように構文があまり推測できません
基本的に
${string//substring/replacement}
はイメージ通りのものを返すので、以下のように使うことができます。というようにします。次の問題は、最初の正規表現が機能しなくなったことですが、これは次のように置き換えることができます。
結局、エスケープする必要すらありませんでした'。JSONの ' を全て quot;に置き換えただけです。いやー、毎日勉強になりますね。
みたいなのを見つけたんだけど.