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

How do I suppress unwanted dollar and quote symbols when using "printf %q"?

我需要转义 public 键中的换行符,以便将其嵌入到 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。我从 bash 得到与 CentOS6 提供的结果相同的结果。

您可以使用 awk 进行转义:

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

使用 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 选项将名为 pkeyjq 变量设置为存储在 shell 变量 my_key 中的值。然后 jq 脚本输出一个简单的对象,带有一个键 public_key,其值是 pkey.

的内容

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

jq -R '{publickey: .}' < server.pub

-R 选项告诉 jq 将其输入作为原始文本读取,而不是作为 JSON 进行解析。对象内部的.表示过滤器的输入,所以文件的内容作为publickey.

的值