首页 > 解决方案 > BASH:将带有控制字符和转义双引号的 JSON 值转换为可打印的纯文本

问题描述

我的任务是遍历几个将 Bigquery SQL 查询嵌入为 JSON 值的文件,并仅使用 SQL 语句输出文件。JSON 值在两个双引号内。JSON 格式值中的查询文本可以包含不同的控制字符,例如 \n 表示换行符,\t 表示制表符,后退 tics `,单引号 ' 和转义的双引号“。单 tics 和后退 tics 在 JSON 值中不进行转义。 JSON 文件中的控制字符应转换为打印值:\n 和 \t 应替换为换行符和制表符,“应该只是”)输入文件示例

...
--params='{
  "query": "CREATE OR REPLACE TABLE flemming.testing2 AS\nSELECT \"12\" as Test,\n-- This is a comment \"?=\" ^`\n            \"23\" AS Valid\n,  45 as name\n\n/** Another comment with a backslash  $ \\\" ´\" * , **/\nFROM flemming.testing ;\n\n"
}' \
...

这是所需的输出


CREATE OR REPLACE TABLE flemming.testing2 AS
SELECT "12" as Test,
-- This is a comment '?=" ^`
            '23' AS Valid
,  45 as name

/** Another comment with a backslash  $ \" ´' * , **/
FROM flemming.testing ;

我已经尝试使用 sed 命令很多天,并寻找一个标准工具来将 JSON 格式的值转换回原始文本,但到目前为止还没有运气。

标签: jsonbash

解决方案


用于jq在 shell 中处理 JSON。我将您的查询保存为 json 文件1.json

{
  "query": "CREATE OR REPLACE TABLE flemming.testing2 AS\nSELECT \"12\" as Test,\n-- This is a comment \"?=\" ^`\n            \"23\" AS Valid\n,  45 as name\n\n/** Another comment with a backslash  $ \\\" ´\" * , **/\nFROM flemming.testing ;\n\n"
}

并运行以下命令:

jq -r '.query' 1.json

-r代表“--raw-output”,它输出没有 JSON 格式的字符串。

这是输出:

CREATE OR REPLACE TABLE flemming.testing2 AS
SELECT "12" as Test,
-- This is a comment "?=" ^`
            "23" AS Valid
,  45 as name

/** Another comment with a backslash  $ \" ´" * , **/
FROM flemming.testing ;

我认为周围的双引号23是正确的,以及 and 之前?=的双引号也是正确的*


推荐阅读