Substitua um valor em um arquivo, em um determinado contexto, por um resultado de operação

Substitua um valor em um arquivo, em um determinado contexto, por um resultado de operação

Eu tenho uma matriz de objetos JSON com URLs locais internos e parâmetros de velocidade, como [{server:"192.168.0.100", speed:34}, {server:"192.168.0.130", speed:52},...]
preciso atualizar o valor de velocidade para cada servidor.

Lendo links como   Substitua apenas se a string for encontrada em um determinado contexto   Eu tentei isso:

#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

Mas não funciona:

hospedeiro desconhecido \1

Responder1

Sim, encontrei uma solução usando uma mistura de arrays e 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

Talvez não esteja funcionando, mas funciona e pode ser útil

informação relacionada