Bash

如何在bash中將字元串拆分為數組

  • May 31, 2019

我對程序的輸出有疑問。我需要在 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但我不知道)。

引用自:https://unix.stackexchange.com/questions/129191