本文档涵盖了在 TLDR pages 仓库中记录的用于处理 JSON 和 XML 等结构化数据的命令行实用程序。这些实用程序使用户能够从命令行查询、转换、验证和格式化结构化数据。
本文档的目的是解释用于处理结构化数据格式的关键实用程序,特别是:
jq 工具进行 JSON 处理xml 命令及其子命令)有关文本编辑器和媒体处理工具的信息,请参阅 文本编辑器和媒体工具。有关 shell 实用程序和文本处理的信息,请参阅 Shell 实用程序和文本处理。
结构化数据处理涉及操作符合特定规则的定义格式的数据。下图说明了处理结构化数据的通用工作流程
来源: pages/common/jq.md pages/common/xml.md
JQ 是一个轻量级、灵活的命令行 JSON 处理器,它使用特定领域语言 (DSL) 来过滤、转换和操作 JSON 数据。
JQ 的基本语法遵循以下模式:
jq 'filter_expression' input.json
或者在使用管道时:
cat input.json | jq 'filter_expression'
下表总结了 TLDR pages 中记录的关键 JQ 操作:
| 操作 | 描述 | 示例 |
|---|---|---|
. | 标识过滤器(格式化整个 JSON) | jq '.' file.json |
.key | 访问对象属性 | jq '.name' file.json |
.[index] | 访问数组元素 | jq '.[0]' file.json |
.[] | 遍历所有数组/对象值 | jq '.[]' file.json |
select(condition) | 根据条件过滤 | jq '.[] | select(.key=="value")' file.json |
+/- | 添加/删除键 | jq '. + {"key": "value"}' file.json |
下图说明了 JQ 如何处理 JSON 数据:
根据 TLDR pages 的文档,这里是 JQ 的主要用例:
格式化与检查:显示彩色和格式化的 JSON 输出
jq '.' /path/to/file.json
脚本执行:使用文件中的 JQ 脚本
cat path/to/file.json | jq --from-file path/to/script.jq
对象创建:从现有对象创建新的 JSON 对象
cat path/to/multiple_json_file_*.json | jq '{newKey1: .key1, newKey2: .key2.nestedKey}'
数组处理:访问或遍历数组项
cat path/to/file.json | jq '.[index1], .[index2]'
cat path/to/file.json | jq '.[]'
条件过滤:根据属性值过滤对象
cat path/to/file.json | jq '.[] | select((.key1=="value1") and .key2=="value2")'
对象修改:添加或删除键
cat path/to/file.json | jq '. + {"key1": "value1"}'
cat path/to/file.json | jq '. - {"key1": "value1"}'
XMLStarlet 是一个用于 XML 处理的命令行工具包,它提供了查询、编辑、格式化和验证 XML 文档的功能。它包含一个主命令(xml)以及用于特定 XML 操作的各种子命令。
XMLStarlet 命令遵循以下通用模式:
xml subcommand options input.xml
或与管道一起使用:
cat input.xml | xml subcommand options
XMLStarlet 工具包包含多个子命令,每个子命令都针对特定的 XML 处理需求:
来源: pages/common/xml.md pages/common/xml-select.md pages/common/xml-edit.md pages/common/xml-validate.md pages/common/xml-format.md pages/common/xml-transform.md pages/common/xml-elements.md pages/common/xml-escape.md pages/common/xml-unescape.md pages/common/xml-list.md pages/common/xml-canonic.md pages/common/xml-pyx.md pages/common/xml-depyx.md
根据 TLDR pages 的文档,以下是主要的 XMLStarlet 子命令及其功能:
用于使用 XPath 表达式查询 XML 文档
xml select --template --match "XPATH1" --value-of "XPATH2" input.xml
用于修改 XML 文档
xml edit --delete "XPATH1" input.xml
xml edit --update "XPATH1" -v "value" input.xml
xml edit --rename "XPATH1" -v "newName" input.xml
用于根据模式验证 XML 文档
xml validate input.xml # Well-formedness check
xml validate --dtd schema.dtd input.xml # DTD validation
xml validate --xsd schema.xsd input.xml # XSD validation
xml validate --relaxng schema.rng input.xml # RelaxNG validation
用于格式化 XML 文档
xml format --indent-tab input.xml > output.xml # Tab indentation
xml format --indent-spaces 4 input.xml > output.xml # 4-space indentation
xml format --recover --noindent malformed.xml > output.xml # Recover parsable parts
用于使用 XSLT 转换 XML
xml transform stylesheet.xsl -p "Count='count(/xml/element)'" input.xml
用于提取元素并显示 XML 文档的结构
xml elements -u input.xml # Print unique elements to see structure
xml elements -a input.xml > elements.xpath # Extract elements and attributes
用于处理特殊的 XML 字符
xml escape "<a1>" # Output: <a1>
xml unescape "<a1>" # Output: <a1>
来源: pages/common/xml-select.md7-22 pages/common/xml-edit.md6-25 pages/common/xml-validate.md6-21 pages/common/xml-format.md6-24 pages/common/xml-transform.md6-8 pages/common/xml-elements.md6-26 pages/common/xml-escape.md6-12 pages/common/xml-unescape.md6-12
下图说明了使用 XMLStarlet 的 XML 处理流程:
JSON 和 XML 处理工具都遵循类似的数据操作模式。本节将通过这两个工具的示例来概述这些通用模式。
从结构化文档中提取特定数据点
JSON (jq):
jq '.key1, .key2' input.json # Extract specific keys
jq '.[0], .[1]' input.json # Extract specific array elements
XML (XMLStarlet):
xml select --match "//element" --value-of "@attribute" input.xml # Extract attribute values
xml select --template --value-of "count(//element)" input.xml # Count elements
将数据转换为不同的格式或结构
JSON (jq):
jq '. + {"newKey": "newValue"}' input.json # Add new properties
jq '. - {"keyToRemove": "value"}' input.json # Remove properties
XML (XMLStarlet):
xml edit --update "//element/@attr" -v "newValue" input.xml # Update attributes
xml transform stylesheet.xsl input.xml # Transform using XSLT
验证数据是否符合预期的格式或模式
XML (XMLStarlet):
xml validate input.xml # Check well-formedness
xml validate --dtd schema.dtd input.xml # Validate against DTD
xml validate --xsd schema.xsd input.xml # Validate against XSD
格式化数据以提高可读性
JSON (jq):
jq '.' input.json # Format JSON with colors and indentation
XML (XMLStarlet):
xml format --indent-tab input.xml # Format with tab indentation
xml format --indent-spaces 4 input.xml # Format with 4-space indentation
下图展示了结构化数据处理如何集成到典型的命令行工作流程中:
来源: pages/common/jq.md6-36 pages/common/xml-select.md7-22 pages/common/xml-edit.md6-25 pages/common/xml-validate.md6-21 pages/common/xml-format.md6-24 pages/common/xml-transform.md6-8
虽然 JQ 和 XMLStarlet 都服务于不同数据格式的类似目的,但它们具有独特的特性和功能。
| 功能 | JSON (jq) | XML (XMLStarlet) |
|---|---|---|
| 查询语言 | JQ DSL | XPath |
| Schema 验证 | 不内置 | DTD、XSD、RelaxNG 支持 |
| 转换 | 过滤表达式 | XSLT |
| 命令语法 | 简洁 | 更冗长 |
| 数据模型 | 对象、数组、原始类型 | 带有属性的元素树 |
| 命名空间 (Namespaces) | 不支持 | 完整的命名空间支持 |
| 字符处理 | 自动 | 显式的转义/反转义命令 |
| 结构可视化 | 有限 | 专用元素命令 |
来源: pages/common/jq.md pages/common/xml.md pages/common/xml-validate.md pages/common/xml-transform.md pages/common/xml-escape.md pages/common/xml-unescape.md pages/common/xml-elements.md
TLDR pages 存储库提供了对基本结构化数据处理工具的简洁文档。JQ 以其简洁的领域特定语言提供了强大的 JSON 处理能力,而 XMLStarlet 则提供了全面的 XML 操作工具包。
这些工具使用户能够直接从命令行中提取、转换、验证和格式化结构化数据。TLDR pages 中的示例可以作为常见数据处理任务和模式的宝贵快速参考。
刷新此 Wiki
最后索引时间2025 年 4 月 18 日(56942f)