菜单

数据处理和结构化数据

相关源文件

本文档涵盖了在 TLDR pages 仓库中记录的用于处理 JSON 和 XML 等结构化数据的命令行实用程序。这些实用程序使用户能够从命令行查询、转换、验证和格式化结构化数据。

目的与范围

本文档的目的是解释用于处理结构化数据格式的关键实用程序,特别是:

  • 使用 jq 工具进行 JSON 处理
  • 使用 XMLStarlet 工具包进行 XML 处理(xml 命令及其子命令)

有关文本编辑器和媒体处理工具的信息,请参阅 文本编辑器和媒体工具。有关 shell 实用程序和文本处理的信息,请参阅 Shell 实用程序和文本处理

结构化数据处理概述

结构化数据处理涉及操作符合特定规则的定义格式的数据。下图说明了处理结构化数据的通用工作流程

来源: pages/common/jq.md pages/common/xml.md

使用 JQ 进行 JSON 处理

JQ 是一个轻量级、灵活的命令行 JSON 处理器,它使用特定领域语言 (DSL) 来过滤、转换和操作 JSON 数据。

JQ 命令结构

JQ 的基本语法遵循以下模式:

jq 'filter_expression' input.json

或者在使用管道时:

cat input.json | jq 'filter_expression'

常见的 JQ 操作

下表总结了 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 处理流程

下图说明了 JQ 如何处理 JSON 数据:

来源: pages/common/jq.md6-36

JQ 的主要用例

根据 TLDR pages 的文档,这里是 JQ 的主要用例:

  1. 格式化与检查:显示彩色和格式化的 JSON 输出

    jq '.' /path/to/file.json
    
  2. 脚本执行:使用文件中的 JQ 脚本

    cat path/to/file.json | jq --from-file path/to/script.jq
    
  3. 对象创建:从现有对象创建新的 JSON 对象

    cat path/to/multiple_json_file_*.json | jq '{newKey1: .key1, newKey2: .key2.nestedKey}'
    
  4. 数组处理:访问或遍历数组项

    cat path/to/file.json | jq '.[index1], .[index2]'
    cat path/to/file.json | jq '.[]'
    
  5. 条件过滤:根据属性值过滤对象

    cat path/to/file.json | jq '.[] | select((.key1=="value1") and .key2=="value2")'
    
  6. 对象修改:添加或删除键

    cat path/to/file.json | jq '. + {"key1": "value1"}'
    cat path/to/file.json | jq '. - {"key1": "value1"}'
    

来源: pages/common/jq.md6-36

使用 XMLStarlet 进行 XML 处理

XMLStarlet 是一个用于 XML 处理的命令行工具包,它提供了查询、编辑、格式化和验证 XML 文档的功能。它包含一个主命令(xml)以及用于特定 XML 操作的各种子命令。

XMLStarlet 命令结构

XMLStarlet 命令遵循以下通用模式:

xml subcommand options input.xml

或与管道一起使用:

cat input.xml | xml subcommand options

XMLStarlet 工具包组件

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

XMLStarlet 的主要子命令

根据 TLDR pages 的文档,以下是主要的 XMLStarlet 子命令及其功能:

1. xml select

用于使用 XPath 表达式查询 XML 文档

xml select --template --match "XPATH1" --value-of "XPATH2" input.xml

2. xml edit

用于修改 XML 文档

xml edit --delete "XPATH1" input.xml
xml edit --update "XPATH1" -v "value" input.xml
xml edit --rename "XPATH1" -v "newName" input.xml

3. xml validate

用于根据模式验证 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

4. xml format

用于格式化 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

5. xml transform

用于使用 XSLT 转换 XML

xml transform stylesheet.xsl -p "Count='count(/xml/element)'" input.xml

6. xml elements

用于提取元素并显示 XML 文档的结构

xml elements -u input.xml                # Print unique elements to see structure
xml elements -a input.xml > elements.xpath  # Extract elements and attributes

7. xml escape/unescape

用于处理特殊的 XML 字符

xml escape "<a1>"              # Output: &lt;a1&gt;
xml unescape "&lt;a1&gt;"      # 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

XML 处理流程

下图说明了使用 XMLStarlet 的 XML 处理流程:

来源: pages/common/xml.md11-22

常见数据处理模式

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

JSON 与 XML 处理:比较

虽然 JQ 和 XMLStarlet 都服务于不同数据格式的类似目的,但它们具有独特的特性和功能。

功能JSON (jq)XML (XMLStarlet)
查询语言JQ DSLXPath
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 中的示例可以作为常见数据处理任务和模式的宝贵快速参考。