解析冒号分隔值对

Phi*_*ide 6 text-processing json jq

我已经编写了一个转换为 json的脚本nmcli --mode multiline dev wifi但我发现它不一致(当结果有空格时会中断)、很长且难以阅读。

我想知道是否可以将结果直接传送到jq. 输出看起来像:

*:                                       
SSID:                                   VIDEOTRON2255
MODE:                                   Infra
CHAN:                                   11
RATE:                                   54 Mbit/s
SIGNAL:                                 69
BARS:                                   ???_
SECURITY:                               WPA1 WPA2
*:                                      * 
SSID:                                   VIDEOTRON2947
MODE:                                   Infra
CHAN:                                   6
RATE:                                   54 Mbit/s
SIGNAL:                                 49
BARS:                                   ??__
SECURITY:                               WPA1 WPA2
Run Code Online (Sandbox Code Playgroud)

我正在寻找生成这样的东西:

[{
    "network": "VIDEOTRON2255",
    "mode": "Infra",
    "chan": "11",
    "rate": "54 Mbit/s",
    "signal": "69",
    "bars": "???_",
    "security": "WPA1 WPA2"
},
{
    "network": "VIDEOTRON2947",
    "mode": "Infra",
    "chan": "6",
    "rate": "54 Mbit/s",
    "signal": "49",
    "bars": "??__",
    "security": "WPA1 WPA2"
}]
Run Code Online (Sandbox Code Playgroud)

是的,我之前确实问过一个相关的问题。这是我根据Gilles answer编写的第一个脚本,它适用于某些值,但不适用于或有空格的值。securityrate

don*_*sti 7

您链接到的脚本效率极低-您正在执行大量无用的预处理...在模式中
使用nmcli--terse因为根据手册,“此模式是专为计算机(脚本)处理而设计的”,请指定所需的字段并将输出通过管道传输到jq -sR例如

printf '%s' "$(nmcli -f ssid,mode,chan,rate,signal,bars,security -t dev wifi)" | \
jq -sR 'split("\n") | map(split(":")) | map({"network": .[0],
                                             "mode": .[1],
                                             "channel": .[2],
                                             "rate": .[3],
                                             "signal": .[4],
                                             "bars": .[5],
                                             "security": .[6]})'
Run Code Online (Sandbox Code Playgroud)