使用“printf%q”时如何抑制不需要的美元和引号?

时间:2016-02-09 14:32:28

标签: bash printf quoting

我需要转义公钥中的换行符,以便将其嵌入到bash脚本中的json输出中。我想做的是:

Little-Net:~ minfrin$ [escape-it-somehow] server.pub"
-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqczXmXuynhalcmzP7ebV\nd7RYLLKJlGLT3OGL5VMnttvPRWoYGueseXnwlHKOcEYv0ZdSVi+e+yWK0lVgARQ9\nkNdumatV9h1S7IHC8fFexuz32Pu7piZlIcsRR+wSWXyA53KPT3NahlLqUGzQ66WX\nGqNmvcJjY0YcaPYjDsueTuQK3wogGOYrVetI33nVX/1ckBbtjgAjf8Bpieb2SQ1Z\nJYt+iBE4h7shUrRT9kT7+8BpGuZgUTVYFSxRw9r6TaFrLyaImRCELTqrxILSHWcz\nJtYBzyYFjYzENNn5L4fcrDFIId5oNil3ZaDtDFNdekdyOdirSHC3J7+aHbYKnC8a\nWwIDAQAB\n-----END PUBLIC KEY-----

我曾尝试使用bash printf函数,但由于原因我不明白输出被一个美元包围并引用如下字符:

Little-Net:~ minfrin$ printf %q "$(cat server.pub)"
$'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqczXmXuynhalcmzP7ebV\nd7RYLLKJlGLT3OGL5VMnttvPRWoYGueseXnwlHKOcEYv0ZdSVi+e+yWK0lVgARQ9\nkNdumatV9h1S7IHC8fFexuz32Pu7piZlIcsRR+wSWXyA53KPT3NahlLqUGzQ66WX\nGqNmvcJjY0YcaPYjDsueTuQK3wogGOYrVetI33nVX/1ckBbtjgAjf8Bpieb2SQ1Z\nJYt+iBE4h7shUrRT9kT7+8BpGuZgUTVYFSxRw9r6TaFrLyaImRCELTqrxILSHWcz\nJtYBzyYFjYzENNn5L4fcrDFIId5oNil3ZaDtDFNdekdyOdirSHC3J7+aHbYKnC8a\nWwIDAQAB\n-----END PUBLIC KEY-----'

我的问题是,为什么printf添加了美元和报价字符?如何阻止printf添加美元和报价符号?我应该使用另一种技术而不是printf来逃避换行符吗?

这是MacOSX 10.10.5提供的bash。我从CentOS6提供的bash得到了相同的结果。

2 个答案:

答案 0 :(得分:2)

您可以使用awk进行转义:

awk -vRS="\n" -vORS="\\\n" '1' server.pub

答案 1 :(得分:2)

使用JSON工具执行JSON转义。例如,使用jq

my_key="-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqczXmXuynhalcmzP7ebV\nd7RYLLKJlGLT3OGL5VMnttvPRWoYGueseXnwlHKOcEYv0ZdSVi+e+yWK0lVgARQ9\nkNdumatV9h1S7IHC8fFexuz32Pu7piZlIcsRR+wSWXyA53KPT3NahlLqUGzQ66WX\nGqNmvcJjY0YcaPYjDsueTuQK3wogGOYrVetI33nVX/1ckBbtjgAjf8Bpieb2SQ1Z\nJYt+iBE4h7shUrRT9kT7+8BpGuZgUTVYFSxRw9r6TaFrLyaImRCELTqrxILSHWcz\nJtYBzyYFjYzENNn5L4fcrDFIId5oNil3ZaDtDFNdekdyOdirSHC3J7+aHbYKnC8a\nWwIDAQAB\n-----END PUBLIC KEY-----"

jq -n --arg pkey "$my_key" '{publickey: $pkey}'

--arg选项将名为jq的{​​{1}}变量设置为shell变量pkey中存储的值。 my_key脚本然后输出一个带有一个键jq的简单对象,其值为public_key的内容。

或者,让pkey直接从文件中读取:

jq

jq -R '{publickey: .}' < server.pub 选项告诉-R将其输入读取为原始文本,而不是作为要解析的JSON。对象内的jq表示过滤器的输入,因此文件的内容用作.的值。