[{server:"192.168.0.100", speed:34}, {server:"192.168.0.130", speed:52},...]
各サーバーの速度値を更新するために必要な内部ローカルURLと速度パラメータを含むJSONオブジェクトの配列があります。
次のリンクを読む 特定のコンテキストで文字列が見つかった場合にのみ置換 私はこれを試しました:
#first by first I delete the old value
sed -i 's/speed:\(.\), //g' $FILENAME
sed -i 's/speed:\(..\), //g' $FILENAME
sed -i 's/speed:\(...\), //g' $FILENAME
sed -i 's/speed:\(....\), //g' $FILENAME
#then I've tried to calculate the new one
sed -i "s/server:\"\(192.168.0...\)\"/server:\"\1\", speed:$( ping -c3 \\1 | grep rtt | cut -f 5 -d '/' ), /g" $FILENAME
しかし、うまくいきません。
不明なホスト\1
ベストアンサー1
はい、配列とsedを組み合わせて使用するソリューションを見つけました...:
#delete the old values
sed -i 's/speed:\(.\), //g' "$FILENAME"
sed -i 's/speed:\(..\), //g' "$FILENAME"
sed -i 's/speed:\(...\), //g' "$FILENAME"
sed -i 's/speed:\(....\), //g' "$FILENAME"
#create an array with just the urls
SERVER=( $(sed -nre 's/.*server:"(.*)".*/\1/p' "$FILENAME") )
#for each element
for element in $(seq 0 $((${#SERVER[@]}-1)))
do
#calculate the new average ping speed
SPEED[element]="$( sudo ping -c2 "${SERVER[element]}" | grep rtt | cut -f 5 -d '/' )"
#if server is not available
if [ -z "${SPEED[element]}" ]; then SPEED[element]=1000 ; fi
#add the old server speed
sed -i "s/\"\(${SERVER[element]}\)\"/\"\1\", speed:${SPEED[element]}/g" "$FILENAME"
done
パフォーマンスは悪いかもしれませんが、うまくいくと便利です。