我对程序的输出有问题。我需要在 bash 中启动一个命令并获取其输出(一个字符串)并将其拆分以在某些地方添加新行。字符串如下所示:
battery.charge: 90 battery.charge.low: 30 battery.runtime: 3690 battery.voltage: 230.0 device.mfr: MGE UPS SYSTEMS device.model: Pulsar Evolution 500
Run Code Online (Sandbox Code Playgroud)
基本上它是一个xxx.yy.zz:值,但该值可能包含空格。这是我想得到的输出
battery.charge: 90
battery.charge.low: 30
battery.runtime: 3690
battery.voltage: 230.0
device.mfr: MGE UPS SYSTEMS
device.model: Pulsar Evolution 500
Run Code Online (Sandbox Code Playgroud)
我有一个想法来搜索第一个点,然后从那个位置往回看空间以在那里放置一个新行,但我不确定如何在 Bash 中实现它。
纯bash解决方案,没有使用外部工具来处理字符串,只是参数扩展:
#! /bin/bash
str='battery.charge: 90 battery.charge.low: 30 battery.runtime: 3690 battery.voltage: 230.0 device.mfr: MGE UPS SYSTEMS device.model: Pulsar Evolution 500'
IFS=: read -a fields <<< "$str"
for (( i=0 ; i < ${#fields[@]} ; i++ )) ; do
f=${fields[i]}
notfirst=$(( i>0 ))
last=$(( i+1 == ${#fields[@]} ))
(( notfirst )) && echo -n ${f% *}
start=('' $'\n' ' ')
colon=('' ': ')
echo -n "${start[notfirst + last]}${f##* }${colon[!last]}"
done
echo
Run Code Online (Sandbox Code Playgroud)
说明:$notfirst和$last是布尔值。第一个字段不会打印最后一个空格之前的部分${f% *},因为没有这样的东西。$start并$colon保存分隔字段的各种字符串:第一项notfirst + last为 0,因此没有任何内容前置,对于其余行,$notfirst为 1,因此打印换行符,对于最后一行,加法给出 2,因此打印出一个空格。然后,打印最后一个空格之后的部分${f##* }。除最后一行外,所有行都打印冒号。