명령줄의 변수에서 데이터 추출

명령줄의 변수에서 데이터 추출

$dc_list와 $TEST_VENUE라는 두 개의 변수가 있습니다. bash에서 에코하면

echo $dc_list
{"active-production-dc":"sc-va1","standby-production-dc":"sc-tx2","active-integration-dc":"int-va1","standby-integration-dc":"int-tx3"}

그리고

echo $TEST_VENUE
standby-production-dc

이제 dc_list에서 TEST_VENUE 값을 가져와야 합니다.

나는 이것을 시도했습니다 :

dc=$(echo "$dc_list" | sed -e 's/^.*'"$TEST_VENUE"':"\([^"]*\)".*$/\1/')  ---> This is not working

하지만 하드코딩하면

dc=$(echo "$dc_list" | sed -e 's/^.*"standby-production-dc":"\([^"]*\)".*$/\1/')  ---> This works.

하지만 나는 그것을 먼저 달성하기 위해 sed를 사용하고 싶습니다. 이에 대한 제안이 있으십니까?

답변1

~을 위한세게 때리다당신은 그것을 사용할 수 있습니다매개변수 확장

result=${dc_list#*$TEST_VENUE\":\"}
result=${result%%\"*}

답변2

이것은 나에게 효과적입니다.

tr '"' _ <<< $dc_list | sed -n "s/.*${TEST_VENUE}_:_\([^_]*\).*/\1/p"

그러나 내 조언은 특히 형식이 변경되는 경우에는 사용하지 않는 것입니다 $dc_list.
json 파서를 사용하는 것이 좋습니다. 나는 다음과 같은 것을 사용할 것입니다PHP 함수 json_decode()그러나 분명히 다른 옵션도 있습니다. 아마도 Python에도 좋은 기능이 있을 수 있습니다.

PHP를 사용하는 이 예제는 json_decode()나에게 잘 작동하며, 물론 작동하는 PHP cli SAPI가 있다고 가정하면 더 안정적입니다.
이 코드를 쉘 스크립트에서 직접 사용할 수 있습니다. zsh를 사용하여 테스트했지만 bash에서도 작동할 수 있기를 바랍니다.

<< 'EOF' php -- "$dc_list" "$TEST_VENUE"
<?php
$a = json_decode($argv[1]);
echo $a->{$argv[2]} . PHP_EOL;
EOF

답변3

JSON 데이터의 경우 다음과 같은 JSON 파서를 사용하세요.

$ jq -r ".[\"$TEST_VENUE\"]" <<< "$dc_list" 
sc-tx2

관련 정보