Ersetzen eines Wertes in einer Datei in einem bestimmten Kontext durch ein Operationsergebnis

Ersetzen eines Wertes in einer Datei in einem bestimmten Kontext durch ein Operationsergebnis

Ich habe ein Array von JSON-Objekten mit lokalen URLs und Geschwindigkeitsparametern, beispielsweise [{server:"192.168.0.100", speed:34}, {server:"192.168.0.130", speed:52},...]
muss ich den Geschwindigkeitswert für jeden Server aktualisieren.

Lesen von Links wie   Ersetzen nur, wenn die Zeichenfolge in einem bestimmten Kontext gefunden wird   Ich habe Folgendes versucht:

#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

Aber es funktioniert nicht:

unbekannter Host \1

Antwort1

Ja, ich habe eine Lösung mit einer Mischung aus Arrays und Sed gefunden:

#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

Vielleicht funktioniert es nicht, aber es funktioniert und könnte nützlich sein

verwandte Informationen