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")"
}