私はこのsedコマンドを使用して、MyKeyと同じキーのjson値を抽出します。
sedPattern='s/^.*"myKey":"\([^"]*\)".*$/\1/'
このようなjson文字列の場合
{"myKey" : 1, "yourKey": 2}
私が必要なものを返します。
1
しかし、\1
上記のsedコマンドの操作はどういう意味ですか?
答え1
\([^"]*\)
実際には2つの中かっこ()の間にある文字セットを定義するので、中かっこを\(
エスケープする必要があります。\)
\1
最初のグループの内容です。
複数のグループは、複数の中かっこペアセットを使用して定義でき、増分的に番号付けされ、各グループは\n
(たとえば\1
、\2
など\3
)として参照されるため、名前は次のようになります。逆参照。
答え2
\1
\(...\)
キャプチャされた部分文字列の最初のセット(つまり、式の最初のセット)の逆参照。入れ子になったグループがある場合、最初のグループは式\(
の左端のグループです。
あなたの例では、文字列の特定の位置にある部分文字列です[^"]*
(二重引用符なしの空の文字列かもしれません)。
JSONを解析するより良い安全な方法は、次のJSON認識ツールを使用することですjq
。
jq -r '.myKey' document.json
これにより、構造化言語を使用してデータを抽出できるだけでなく、抽出したデータをJSONでエンコードできるようになります。
sed
君の表情に気づいた別の言葉1
文書を次のように書き換えない限り、指定されたJSON文書から抽出します。
{"myKey":"1","yourKey":2}
この文書は2つの点で異なります。
キーと値の間のスペースは異なります。これは、JSONパーサーには重要ではありませんが、JSON構造を理解していないラインベースのツールには重要です。
これで、キー値の型は
myKey
数値ではなく文字列です。これは、パーサーがどのように値を処理するかによって重要です。値に変換する必要があります。予想される文字列になります。これは、データを使用するアプリケーションによって異なります。
また、文書は次のとおりです。同じ到着
{
"myKey": "1",
"yourKey": 2
}
JSONパーサーは2つの違いを見ることができませんが、sed
ある文書では何かを抽出できますが、別の文書では抽出できない可能性があります。