web-dev-qa-db-ja.com

文字列内の0個以上のスペースに一致するようにsed

function getVal {
  sedPattern='s/^.*"keyVal":"\([^"]*\)".*$/\1/'
  finalSedPattern=${sedPattern/keyVal/$2}
  echo $(sed $finalSedPattern  <<< $1)
}

これは、sedを使用して記述された私のJsonパーサーです。 json文字列、キー名を受け取り、次のような値を返します。

myJson='{"hello":"sk"}'
val=$(getVal $myJson hello)
echo $val

プリント、sk

ただし、json文字列にスペースが含まれる場合と含まれない場合があります。

myJson='{"hello" : "sk"}'

その場合、関数は失敗します。 [ ]を追加して上記のパターンを微調整し、0個以上のスペースに一致させてみました。

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

次のようにエラーをスローします。

unterminated `s' command

Sed内にキャプチャされていないパターングループを指定するにはどうすればよいですか?

2
user93868

sedPatternに引用符に関する問題があります。同じ見積もりを2回一致させようとしています。また、+は1つ以上に使用されます。 0以上の場合は、*を使用します。
注意:以下のコードはテストされていませんが、うまくいくはずです。

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

2
Munir

変数展開を引用する必要があります(コードからのほんの一例):

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