You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本嵌套While循环及Ksh解析JSON文件问题求助

用Korn Shell解析JSON的靠谱方案

嘿,我看你正在尝试用Ksh脚本结合sed、awk这类文本工具解析JSON,但这种做法其实挺脆弱的——JSON的格式灵活性很高(比如嵌套结构、空格换行的变化),很容易让你的正则匹配失效,遇到复杂结构时脚本会变得难维护还容易出错。

原脚本的问题

你的脚本依赖硬编码的字符串替换(比如把}}}}换成换行)和正则匹配提取字段,但只要JSON的键值对多了个空格、字段顺序变了,甚至嵌套层级调整,你的sed/cut命令就可能提取不到正确内容,容错性极差。

更可靠的选择:用jq专门处理JSON

jq是一款专为JSON设计的轻量级命令行工具,它能准确理解JSON的结构,不管格式怎么变化都能精准提取字段,几乎所有Linux发行版都可以通过包管理器安装(比如yum install jq或apt install jq)。

针对你的样本JSON结构({"results":[{"general-info":{"full-name":"TELOS MANAGEMENT","body":{"party":{"xrefs":{"xref...),假设你要从results数组的每个对象中提取general-info.full-name和对应的id(你可以根据实际字段位置调整路径),用jq的脚本会简洁很多:

#!/bin/ksh

# 用jq解析JSON,提取full-name和id字段,输出指定格式
jq -r '.results[] | "\(.general-info."full-name")|\(.body.party.xrefs.id)"' /var/tmp/Cloud_test.txt

命令解释

  • -r:让jq输出原始字符串(不带引号),方便后续处理
  • .results[]:遍历results数组中的每一个元素
  • \(.general-info."full-name"):提取嵌套字段general-info下的full-name(因为字段名含连字符,需要用引号包裹)
  • 用|分隔两个字段,输出格式和你原脚本的"${firstname}'|'${id}"一致

如果没法用jq怎么办?

如果你的环境确实无法安装jq,建议用支持JSON解析的脚本语言(比如Python、Perl)处理,比如用Python的json模块:

#!/bin/ksh

python3 -c '
import json
with open("/var/tmp/Cloud_test.txt") as f:
    data = json.load(f)
for item in data["results"]:
    full_name = item["general-info"]["full-name"]
    id_val = item["body"]["party"]["xrefs"]["id"]  # 替换为实际的id字段路径
    print(f"{full_name}|{id_val}")
'

这种方法比sed/awk稳定得多,能正确处理JSON的各种格式变化。

内容的提问来源于stack exchange,提问作者user7392087

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:58:27