私のプログラムの出力に問題があります。 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なので、前に何も追加されません。残りの行は$notfirst
1 であるため、改行が印刷され、最後の行に追加すると 2 が表示されます。スペースが印刷されます。次に、最後のスペースの後の部分を印刷します${f##* }
。コロンは、最後の行を除くすべての行に印刷されます。