json - 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 格式的值转换回原始文本,但到目前为止还没有运气。
解决方案
用于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 之前?=
的双引号也是正确的*
。
推荐阅读
- bash - SED 搜索文本块并在该文本块的末尾添加文本
- reactjs - 使用带有 Typescript 和 React 的 Abort Signal 删除事件处理程序
- r - 如何选择特定“目标”的网页的“href”?
- bash - 文本文件内容匹配 if else 图片分辨率
- django - 为什么不能创建超级用户
- node.js - 构建时将 ts-node package.json 脚本转换为 nodejs package.json 脚本
- reactjs - React i18-next - 为什么使用 i18next-http-backend 而不是导入?
- python - I am struggling with understanding the following list comprehension
- networking - VMWare,无法通过桥接连接从 Windows 10 主机 ping Linux 来宾
- .net-core - 从 .Net Core 调用框架方法时找不到库