\1 - この sed 操作はどういう意味ですか?

\1 - この sed 操作はどういう意味ですか?

私はこの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つの点で異なります。

  1. キーと値の間のスペースは異なります。これは、JSONパーサーには重要ではありませんが、JSON構造を理解していないラインベースのツールには重要です。

  2. これで、キー値の型はmyKey数値ではなく文字列です。これは、パーサーがどのように値を処理するかによって重要です。値に変換する必要があります。予想される文字列になります。これは、データを使用するアプリケーションによって異なります。

また、文書は次のとおりです。同じ到着

{
  "myKey": "1",
  "yourKey": 2
}

JSONパーサーは2つの違いを見ることができませんが、sedある文書では何かを抽出できますが、別の文書では抽出できない可能性があります。

関連情報