Escaping characters in bash (for JSON)
bash, escaping, json
Solution
OK, found out what to do. Bash supports this natively as expected, though as always, the syntax isn't really very guessable!
Essentially `${string//substring/replacement}` returns what you'd image, so you can use
MSG=${MSG//\'/\\\'}
To do this. The next problem is that the first regex doesn't work anymore, but that can be replaced with
git log -n 1 --pretty=format:'%s'
In the end, I didn't even need to escape them. Instead, I just swapped all the ' in the JSON to \". Well, you learn something every day.
Problem
I'm using git, then posting the commit message and other bits as a JSON payload to a server. Currently I have: ``` MSG=`git log -n 1 --format=oneline | grep -o ' .\+'` ``` which sets MSG to something like: ``` Calendar can't go back past today ``` then ``` curl -i -X POST \ -H 'Accept: application/text' \ -H 'Content-type: application/json' \ -d "{'payload': {'message': '$MSG'}}" \ 'https://example.com' ``` My real JSON has another couple of fields. This works fine, but of course when I have a commit message such as the one above with an apostrophe in it, the JSON is invalid. How can I escape the characters required in bash? I'm not familiar with the language, so am not sure where to start. Replacing `'` with `\'` would do the job at minimum I suspect.