function getVal {
sedPattern='s/^.*"keyVal":"\([^"]*\)".*$/\1/'
finalSedPattern=${sedPattern/keyVal/$2}
echo $(sed $finalSedPattern <<< $1)
}
이것이 제가 사용하는 것입니다 sed
. json 문자열, 키 이름을 받아들이고 다음과 같은 값을 반환합니다.
myJson='{"hello":"sk"}'
val=$(getVal $myJson hello)
echo $val
인쇄,sk
하지만 때로는 내 json 문자열에 공백이 포함될 수도 있고 포함되지 않을 수도 있습니다.
myJson='{"hello" : "sk"}'
이 경우 함수가 실패합니다. [ ]
일치하는 0개 이상의 공백을 추가하여 위 패턴을 적용 해 보았습니다 .
sedPattern='s/^.*"keyVal"[ ]+:"\([^"]*\)".*$/\1/'
오류가 발생합니다.
unterminated `s' command
sed에서 비캡처 모드 그룹을 어떻게 제공하나요?
답변1
귀하의 견적 sedPattern
에 몇 가지 문제가 있습니다 . 동일한 참조를 두 번 일치시키려고 합니다. 또한 +는 하나 이상을 나타내는 데 사용됩니다. 0 이상인 경우 *를 사용하세요.
참고: 아래 코드는 테스트되지 않았지만 계속하는 데 도움이 될 것입니다.
sedPattern='s/^.*"keyVal"[ ]*:.*\(".*"\).*$/\1/'
답변2
변수 확장을 인용해야 합니다(코드의 예).
sed $finalSedPattern
따옴표가 없으며 공백으로 구분됩니다(사용 시). 다음을 사용해야 합니다.
sed "$finalSedPattern"
인용된 기능:
function getVal {
sedPattern='s/^.*"keyVal":"\([^"]*\)".*$/\1/1'
finalSedPattern="${sedPattern/keyVal/$2}"
echo "$(sed "$finalSedPattern" <<< "$1")"
}
선택적 공백이 있는 경우:
function getVal {
sedPattern='s/^.*"keyVal"[ ]\{0,\}:[ ]\{0,\}"\([^"]*\)".*$/\1/1'
finalSedPattern="${sedPattern/keyVal/$2}"
echo "$(sed "$finalSedPattern" <<< "$1")"
}