O mais simples é usar três printf consecutivas, a principal com %s em vez de %q :
$ printf '{"log": "'; printf '%s\n' $(<file); printf '"}\n'
{"log": "1\n2\n'\n3\n4\n"}
Eu tenho um arquivo que eu preciso converter em uma string json e isso precisa ser feito via bash .
Meu arquivo de teste parece
1
2
'
3
4
Aqui está o que está acontecendo
$ LOG=$(cat file)
$ printf '{"log": "%q"}\n' "$LOG"
{"log": "$'1\n2\n\'\n3\n4'"}
As coisas parecem boas, como se manejasse as novas linhas e o ' , mas adicionava $' no início e ' no final.