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でこれを実装する方法がわかりません。

ベストアンサー1

純粋な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

説明:$notfirst合計は$lastブール値です。最初のフィールドは、最後のスペースの前の部分を印刷しません。${f% *}なぜならそんなことがないからです。$startそして、$colonフィールドを区切るさまざまな文字列を保存します。最初の項目notfirst + lastは0なので、前に何も追加されません。残りの行は$notfirst1 であるため、改行が印刷され、最後の行に追加すると 2 が表示されます。スペースが印刷されます。次に、最後のスペースの後の部分を印刷します${f##* }。コロンは、最後の行を除くすべての行に印刷されます。

おすすめ記事