파일의 값을 특정 컨텍스트의 작업 결과로 바꿉니다.

파일의 값을 특정 컨텍스트의 작업 결과로 바꿉니다.

[{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

성능이 좋지 않을 수도 있지만 작동하고 유용할 수 있습니다.

관련 정보