sed는 문자열에서 0개 이상의 공백과 일치합니다.

sed는 문자열에서 0개 이상의 공백과 일치합니다.
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")"
}

관련 정보