Reemplazar un valor en un archivo, en un contexto determinado, con el resultado de una operación

Reemplazar un valor en un archivo, en un contexto determinado, con el resultado de una operación

Tengo una matriz de objetos JSON con URL locales internas y parámetros de velocidad, como si [{server:"192.168.0.100", speed:34}, {server:"192.168.0.130", speed:52},...]
necesitara actualizar el valor de velocidad para cada servidor.

Leer enlaces como   Reemplazar solo si la cadena se encuentra en un contexto determinado   He probado esto:

#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

Pero no funciona:

host desconocido \1

Respuesta1

Sí, encontré una solución usando una combinación de matrices y 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

Quizás no esté funcionando pero funciona y podría ser útil.

información relacionada