【问题标题】:Bash Script - irsend LIST Output to JSONBash 脚本 - 将 LIST 输出发送到 JSON
【发布时间】:2017-04-26 17:34:11
【问题描述】:

我有这个命令:

irsend LIST lgtv ""

输出如下:

irsend: 00000000000010ef KEY_POWER
irsend: 0000000000008877 KEY_1
irsend: 00000000000048b7 KEY_2
irsend: 000000000000c837 KEY_3
irsend: 00000000000028d7 KEY_4
irsend: 000000000000a857 KEY_5
irsend: 0000000000006897 KEY_6
irsend: 000000000000e817 KEY_7
irsend: 00000000000018e7 KEY_8
irsend: 0000000000009867 KEY_9
irsend: 00000000000008f7 KEY_0

我如何抓取每一行并获取代码和键名并将它们输出为 JSON 格式?

EG:

[
    {"code": "00000000000010ef", "key": "KEY_POWER" },
    {"code": "0000000000008877", "key": "KEY_1" },
    {"code": "00000000000048b7", "key": "KEY_2" }
]

【问题讨论】:

  • 您可以使用jq 实用程序在bash 脚本中操作JSON。
  • 这不是有效的 JSON。 JSON 字符串必须用双引号,而不是单引号。
  • @Barmar 只是一个概念,但请参阅编辑

标签: json bash jq


【解决方案1】:

这里的关键是 -R 命令行选项,它允许一次读取一行。根据您的输入,以下调用会产生显示的结果(截断):

$ jq -c -R 'split(" ") | {code: .[1], key: .[2]}' input.txt
{"code":"00000000000010ef","key":"KEY_POWER"}
{"code":"0000000000008877","key":"KEY_1"}
{"code":"00000000000048b7","key":"KEY_2"}

您可能需要考虑对输入字符串进行标记,例如如果你的 jq 有splits/1:

[splits(" +")] | {code: .[1], key: .[2]}

注意splits/1 产生一个流,而split/1 产生一个数组。

如果您希望将结果作为单个数组,则可以将上述内容通过管道传递到jq -s .

【讨论】:

    【解决方案2】:

    以 AWK 为例:

    irsend LIST lgtv "" | awk 'BEGIN{print "["}{{printf("{'"'"'code'"'"' : '"'"'%s'"'"', '"'"'key'"'"', '"'"'%s'"'"'}\n",$2,$3)}END{print "]"}'
    

    疯狂的'"'"' 构造确保' 实际输出。使用双引号更容易(和 JSONier):

    irsend LIST lgtv "" | awk 'BEGIN{print "["}{{printf("{\"code\" : \"%s\", \"key\", \"%s\"}\n",$2,$3)}END{print "]"}'
    

    【讨论】:

    • 当你编辑你的答案时,你不需要保留原来的错误代码。有兴趣的可以看看编辑历史。这不像编辑一个问题,应该保留原始代码以维护答案的上下文。
    • @Barmar 接受并修复 - 我只是懒惰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2022-01-15
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多