sedは文字列内のゼロ個以上のスペースと一致します。

sedは文字列内のゼロ個以上のスペースと一致します。
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"}'

この場合、関数は失敗します。[ ]一致するゼロ以上のスペースを追加して上記のパターンを適用してみました。

sedPattern='s/^.*"keyVal"[ ]+:"\([^"]*\)".*$/\1/'

エラーが発生します。

unterminated `s' command

sedで非キャプチャモードグループをどのように提供しますか?

答え1

あなたの見積もりsedPatternにはいくつかの問題があります。同じ参照を2回一致させようとしています。また、+ は 1 つ以上を表すために使用されます。 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")"
}

関連情報