1. ホーム
  2. json

bashのエスケープ文字 (JSON用)

2023-12-16 10:17:26

質問

私は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 で必要な文字をどのようにエスケープすればよいのでしょうか。この言語には詳しくないので、どこから始めればよいのかわかりません。置き換える '\' であれば、最低限の仕事はできるのではないでしょうか。

どのように解決するのですか?

OK、どうすればいいかわかりました。Bash は予想通りこれをネイティブにサポートしていますが、いつものように構文はあまり推測できません!

本質的には ${string//substring/replacement} はイメージどおりのものを返すので

MSG=${MSG//\'/\\\'}

これを行うには 次の問題は、最初の正規表現が機能しなくなったことですが、これは次のように置き換えることができます。

git log -n 1 --pretty=format:'%s'

結局、エスケープする必要すらありませんでした。その代わり、JSONの「'」を全て「˶‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾」に入れ替えただけです。いやー、毎日勉強になりますね。