Skip to content
← 返回文件与文本处理列表
文件与文本处理任务与配置

命令与脚本:文本处理与检索 · 查询与转换 JSON、YAML 和结构化输出 ​

返回分篇目录

查询与转换 JSON、YAML 和结构化输出 ​

处理 JSON 从 jq 开始;JSONPath 查询见 ajson,偏好 Python 表达式可看 jello。yq 的 v3 与 v4 示例必须按已安装版本选择。

jq · 一个使用特定领域语言(DSL)的 JSON 处理器 ​

更多信息:https://jqlang.org/manual/。

  • 使用 jq 二进制执行特定的表达式(打印出彩色和格式化的 JSON 输出):
bash
jq '.' {{路径/到/文件.json}}
  • 执行特定的脚本:
bash
{{cat 路径/到/文件.json}} | jq {{[-f|--from-file]}} {{路径/到/脚本.jq}}
  • 传递特定的参数:
bash
{{cat 路径/到/文件.json}} | jq {{--arg "name1" "value1" --arg "name2" "value2" ...}} '{{. + $ARGS.named}}'
  • 通过来自多个文件的旧 JSON 对象创建新的 JSON 对象:
bash
{{cat 路径/到/多个_json_文件_*.json}} | jq '{{{newKey1: .key1, newKey2: .key2.nestedKey, ...}}}'
  • 打印特定的数组项:
bash
{{cat 路径/到/文件.json}} | jq '{{.[索引1], .[索引2], ...}}'
  • 打印所有数组/对象中的值:
bash
{{cat 路径/到/文件.json}} | jq '.[]'
  • 打印具有双条件过滤的数组对象:
bash
{{cat 路径/到/文件.json}} | jq '.[] | select((.key1=="value1") and .key2=="value2")'
  • 添加/移除特定的键:
bash
{{cat 路径/到/文件.json}} | jq '. {{+|-}} {{{"key1": "value1", "key2": "value2", ...}}}'

yq · 一个轻量级且可移植的命令行 YAML 处理器 ​

更多信息:https://mikefarah.gitbook.io/yq/。

  • 以漂亮打印格式输出 YAML 文件(v4+):
bash
yq eval {{路径/到/file.yaml}}
  • 以漂亮打印格式输出 YAML 文件(v3):
bash
yq read {{路径/到/file.yaml}} {{[-C|--colors]}}
  • 输出仅包含数组的 YAML 文件中的第一个元素(v4+):
bash
yq eval '.[0]' {{路径/到/file.yaml}}
  • 输出仅包含数组的 YAML 文件中的第一个元素(v3):
bash
yq read {{路径/到/file.yaml}} '[0]'
  • 在文件中设置(或覆盖)键的值(v4+):
bash
yq eval '.{{键}} = "{{值}}"' {{[-i|--inplace]}} {{路径/到/file.yaml}}
  • 在文件中设置(或覆盖)键的值(v3):
bash
yq write {{[-i|--inplace]}} {{路径/到/file.yaml}} '{{键}}' '{{值}}'
  • 合并两个文件并打印到 stdout(v4+):
bash
yq eval-all 'select(filename == "{{路径/到/file1.yaml}}") * select(filename == "{{路径/到/file2.yaml}}")' {{路径/到/file1.yaml}} {{路径/到/file2.yaml}}
  • 合并两个文件并打印到 stdout(v3):
bash
yq merge {{路径/到/file1.yaml}} {{路径/到/file2.yaml}} {{[-C|--colors]}}

ajson · 对 JSON 对象执行 JSONPath 操作 ​

更多信息:https://github.com/spyzhov/ajson#console-application。

  • 从文件中读取 JSON 并执行指定的 JSONPath 表达式:
bash
ajson '{{$..json[?(@.path)]}}' {{路径/到/文件.json}}
  • 从标准输入中读取 JSON 并执行指定的 JSONPath 表达式:
bash
cat {{路径/到/文件.json}} | ajson '{{$..json[?(@.path)]}}'
  • 从 URL 中获取 JSON 并计算指定的 JSONPath 表达式:
bash
ajson '{{avg($..price)}}' '{{https://example.com/api/}}'
  • 读取一些简单的 JSON 并计算一个值:
bash
echo '{{3}}' | ajson '{{2 * pi * $}}'

jello · 一个使用 Python 语法的命令行 JSON 处理器 ​

更多信息:https://github.com/kellyjonbrazil/jello#usage。

  • 将 stdin 中的 JSON 或 JSON-Lines 数据进行美化打印到 stdout:
bash
cat {{文件.json}} | jello
  • 输出 stdin 中的 JSON 或 JSON Lines 数据的模式到 stdout(对 grep 有用):
bash
cat {{文件.json}} | jello -s
  • 输出 stdin 中数组的所有元素(或对象的所有值)为 JSON 或 JSON-Lines 数据到 stdout:
bash
cat {{文件.json}} | jello -l
  • 输出 stdin 中的 JSON 或 JSON-Lines 数据的第一个元素到 stdout:
bash
cat {{文件.json}} | jello _[0]
  • 输出 stdin 中 JSON 或 JSON-Lines 数据中每个元素的给定键的值到 stdout:
bash
cat {{文件.json}} | jello '[i.{{键名}} for i in _]'
  • 输出多个键的值作为新的 JSON 对象(假设输入 JSON 拥有键 key_name1 和 key_name2):
bash
cat {{文件.json}} | jello '{{{"键1": _.键名1, "键2": _.键名2, ...}}}'
  • 输出给定键的值为字符串(并禁用 JSON 输出):
bash
cat {{文件.json}} | jello -r '"{{一些文本}}: " + _.{{键名}}'

jc · 将多个命令的输出转换为 JSON ​

更多信息:https://github.com/kellyjonbrazil/jc#usage。

  • 通过管道将命令输出转换为 JSON:
bash
{{ifconfig}} | jc {{--ifconfig}}
  • 通过魔术语法将命令输出转换为 JSON:
bash
jc {{ifconfig}}
  • 通过管道输出格式化的 JSON:
bash
{{ifconfig}} | jc {{--ifconfig}} {{[-p|--pretty]}}
  • 通过魔术语法输出格式化的 JSON:
bash
jc {{[-p|--pretty]}} {{ifconfig}}

jtbl · 用于在终端中将 JSON 和 JSON Lines 数据打印为表格的工具 ​

更多信息:https://github.com/kellyjonbrazil/jtbl#usage。

  • 从 JSON 或 JSON Lines 输入中打印表格:
bash
cat {{文件.json}} | jtbl
  • 打印表格并指定用于换行的列宽:
bash
cat {{文件.json}} | jtbl --cols={{宽度}}
  • 打印表格并截断行而不是换行:
bash
cat {{文件.json}} | jtbl {{[-t|--truncate]}}
  • 打印表格并不换行或截断行:
bash
cat {{文件.json}} | jtbl {{[-n|--no-wrap]}}

json5 · 将 JSON5 文件转换为 JSON ​

更多信息:https://json5.org/#cli。

  • 将 JSON5 标准输入 转换为 JSON 并输出到 标准输出:
bash
echo {{输入}} | json5
  • 将 JSON5 文件转换为 JSON 并输出到 标准输出:
bash
json5 {{路径/到/输入文件.json5}}
  • 将 JSON5 文件转换为指定的 JSON 文件:
bash
json5 {{路径/到/输入文件.json5}} {{[-o|--out-file]}} {{路径/到/输出文件.json}}
  • 验证一个 JSON5 文件:
bash
json5 {{路径/到/输入文件.json5}} {{[-v|--validate]}}
  • 指定缩进的空格数(或使用 "t" 表示制表符):
bash
json5 {{[-s|--space]}} {{缩进量}}
  • 显示帮助:
bash
json5 {{[-h|--help]}}

zek · 从 XML 生成一个 Go 结构体 ​

更多信息:https://github.com/miku/zek#usage。

  • 从 stdin 中给定的 XML 生成一个 Go 结构体,并将输出显示在 stdout 上:
bash
cat {{路径/到/输入.xml}} | zek
  • 从 stdin 中给定的 XML 生成一个 Go 结构体,并将输出发送到文件:
bash
curl {{[-s|--silent]}} {{https://url/to/xml}} | zek -o {{路径/到/输出.go}}
  • 从 stdin 中给定的 XML 生成一个示例 Go 程序,并将输出发送到文件:
bash
cat {{路径/到/输入.xml}} | zek -p -o {{路径/到/输出.go}}

jwt · 使用 JSON Web Tokens (JWTs) 进行操作 ​

可用的签名或消息认证算法包括 HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384。 更多信息:https://github.com/mike-engel/jwt-cli。

  • 解码一个 JWT:
bash
jwt decode {{jwt字符串}}
  • 将 JWT 解码为 JSON 字符串:
bash
jwt decode {{[-j|--json]}} {{jwt字符串}}
  • 将 JSON 字符串编码为 JWT:
bash
jwt encode {{[-A|--alg]}} {{HS256}} {{[-S|--secret]}} {{1234567890}} '{{json字符串}}'
  • 将键值对载荷编码为 JWT:
bash
jwt encode {{[-A|--alg]}} {{HS256}} {{[-S|--secret]}} {{1234567890}} {{[-P|--payload]}} {{键=值}}

jupytext · 将 Jupyter 笔记本转换为纯文本文件,然后再转换回去 ​

更多信息:https://jupytext.readthedocs.io/en/latest/using-cli.html。

  • 将笔记本转换为成对的 .ipynb/.py 笔记本:
bash
jupytext --set-formats ipynb,py {{notebook}}.ipynb
  • 将笔记本转换为 .py 文件:
bash
jupytext --to py {{notebook}}.ipynb
  • 将 .py 文件转换为没有输出的笔记本:
bash
jupytext --to notebook {{notebook}}.py
  • 将 .md 文件转换为笔记本并运行它:
bash
jupytext --to notebook --execute {{notebook}}.md
  • 更新笔记本中的输入单元格并保留输出和元数据:
bash
jupytext --update --to notebook {{notebook}}.py
  • 更新笔记本的所有配对表示:
bash
jupytext {{[-s|--sync]}} {{notebook}}.ipynb

继续阅读