Bash
如何在bash中將字元串拆分為數組
我對程序的輸出有疑問。我需要在 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
基本上它是一個*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
我有一個想法來搜尋第一個點,然後從那個位置回過頭來尋找空間,在那裡放一條新線,但我不確定如何在 Bash 中實現它。
一個
perl
解決方案:$ perl -pe 's{\S+:}{$seen++ ? "\n$&" : "$&"}ge' file battery.charge: 90 battery.charge.low: 30 battery.runtime: 3690 battery.voltage: 230.0 device.mfr: MGE UPS SYSTEMS device.model: Pulsar Evolution 500
解釋
\S+:
匹配以 . 結尾的字元串:
。- 對於所有匹配的字元串,我們在它們之前插入換行符,
("\n$&")
除了第一個($seen++)
。
使用 GNU sed,您可以匹配每個以 結尾的連續字元串(即沒有空格)
:
,然後在除第一個字元串之外的所有字元串之前放置一個換行符:sed 's/[^[:space:]]\+:/\n&/g2'
如果您的 sed 版本不支持
gn
擴展,您可以使用普通g
修飾符sed 's/[^[:space:]]\{1,\}:/\ &/g'
除了在第一個鍵之前列印一個額外的換行符之外,它的工作方式相同。您可以使用
perl -pe 's/\S+:/\n$&/g'
相同的附帶條件(可能有與 GNU sed 等效的 perl,g2
但我不知道)。