如何将更复杂的以人为本的文本输出解析为机器风格的样式?

问题描述 投票:0回答:1

这是有关如何将“不可解析的”输出解析为json或易于消费为json的内容的问题。这只是琐碎事情的“一点”,所以我想知道,原则上您如何解决这些问题,这不仅与这个特定示例有关。但是例子:

我们有此命令,它显示有关音频输入的数据:

pacmd list-sink-inputs

它打印出这样的内容:

2 sink input(s) available.
    index: 144
    driver: <protocol-native.c>
    flags: 
    state: RUNNING
    sink: 4 <alsa_output.pci-0000_05_00.0.analog-stereo>
    volume: front-left: 15728 /  24% / -37.19 dB,   front-right: 15728 /  24% / -37.19 dB
            balance 0.00
    muted: no
    current latency: 70.48 ms
    requested latency: 210.00 ms
    sample spec: float32le 2ch 44100Hz
    channel map: front-left,front-right
                 Stereo
    resample method: copy
    module: 13
    client: 245 <MPlayer>
    properties:
        media.name = "UNREAL! Tetris Theme on Violin and Guitar-TnDIRr9C83w.webm"
        application.name = "MPlayer"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "32"
        application.process.id = "1543"
        application.process.user = "mmucha"
        application.process.host = "vbDesktop"
        application.process.binary = "mplayer"
        application.language = "C"
        window.x11.display = ":0"
        application.process.machine_id = "720184179caa46f0a3ce25156642f7a0"
        application.process.session_id = "2"
        module-stream-restore.id = "sink-input-by-application-name:MPlayer"
    index: 145
    driver: <protocol-native.c>
    flags: 
    state: RUNNING
    sink: 4 <alsa_output.pci-0000_05_00.0.analog-stereo>
    volume: front-left: 24903 /  38% / -25.21 dB,   front-right: 24903 /  38% / -25.21 dB
            balance 0.00
    muted: no
    current latency: 70.50 ms
    requested latency: 210.00 ms
    sample spec: float32le 2ch 48000Hz
    channel map: front-left,front-right
                 Stereo
    resample method: speex-float-1
    module: 13
    client: 251 <MPlayer>
    properties:
        media.name = "Trombone Shorty At Age 13 - 2nd Line-k9YUi3UhEPQ.webm"
        application.name = "MPlayer"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "32"
        application.process.id = "2831"
        application.process.user = "mmucha"
        application.process.host = "vbDesktop"
        application.process.binary = "mplayer"
        application.language = "C"
        window.x11.display = ":0"
        application.process.machine_id = "720184179caa46f0a3ce25156642f7a0"
        application.process.session_id = "2"
        module-stream-restore.id = "sink-input-by-application-name:MPlayer"

非常好。但是我们不想向用户显示所有这些信息,我们只想以某种合理的格式显示索引(输入的ID),application.process.id,application.name和media.name。最好将它解析为json,但是即使我以某种方式对其进行了预处理,jq也远远超出了我的能力并且非常复杂。我尝试了使用jq,使用正则表达式或不使用正则表达式的多种方法,但无法完成。而且我想我们不能依赖所有字段的顺序或存在。我能够“完成”工作,但是它很杂乱,效率低下,即媒体名称或应用程序名称中不应包含分号。不能接受的解决方案,但这是我唯一可以解决的问题。

不正确的解决方案:

cat exampleOf2Inputs | grep -e "index: \|application.process.id = \|application.name = \|media.name = " | sed "s/^[ \t]*//;s/^\([^=]*\) = /\1: /" | tr "\n" ";" | sed "s/$/\n/;s/index:/\nindex:/g" | tail -n +2 | while read A; do index=$(echo $A|sed "s/^index: \([0-9]*\).*/\1/"); pid=$(echo $A|sed 's/^.*application\.process\.id: \"\([0-9]*\)\".*$/\1/'); appname=$(echo $A|sed 's/^.*application\.name: \"\([^;]*\)\".*$/\1/'); medianame=$(echo $A|sed 's/^.*media\.name: \"\([^;]*\)\".*$/\"\1\"/'); echo "pid=$pid index=$index appname=$appname medianame=$medianame"; done

〜我刺破了有趣的部分,用分号替换了换行符,分割为多行,并使用sed多次提取了数据。疯狂。

这里输出是:

pid=1543 index=144 appname=MPlayer medianame="UNREAL! Tetris Theme on Violin and Guitar-TnDIRr9C83w.webm" pid=2831 index=145 appname=MPlayer medianame="Trombone Shorty At Age 13 - 2nd Line-k9YUi3UhEPQ.webm"

可以轻松转换为任何格式,但是问题是关于json的,所以要:

[ { "pid": 1543, "index": 144, "appname": "MPlayer", "medianame": "UNREAL! Tetris Theme on Violin and Guitar-TnDIRr9C83w.webm" }, { "pid": 2831, "index": 145, "appname": "MPlayer", "medianame": "Trombone Shorty At Age 13 - 2nd Line-k9YUi3UhEPQ.webm" } ]

现在,我想看看这些事情是如何正确完成的。

这是有关如何将“不可解析的”输出解析为json或易于消费为json的内容的问题。这在琐碎的事情后面是“一点”,所以我想知道,您如何解决...

jq text-processing
1个回答
0
投票
您可以将输出通过管道传输到:

0
投票
我不知道“正确”,但这是我要做的:
© www.soinside.com 2019 - 2024. All rights reserved.