ファイル内の二重引用符で囲まれた3番目の単語を置き換える

ファイル内の二重引用符で囲まれた3番目の単語を置き換える

これがjson私たちが編集したいファイルです

実施例1

{
  "topics": [{"topic": "hfgt_kejd_tdsfd”}],
  "version": 1
}

実施例2

{
  "topics": [{"topic": "hfgt_kj_fsrfdfd”}],
  "version": 1
}

topics行の3番目の単語を別の単語に置き換えたい(sedまたはperl onelinerを介して)。

~について実施例1、次に変更しようとするhfgt_kejd_tdsfdと予想される結果test_1

{
  "topics": [{"topic": "test_1”}],
  "version": 1
}

実施例3

more /tmp/file.json

{
  "topics": [{"topic": "TOPIC_GGGG”}],
  "version": 1
}


# sed  's/\(topic\": "\)[a-z_]*/\1test_1/'  /tmp/file.json

{
  "topics": [{"topic": "test_1TOPIC_GGGG”}],
  "version": 1
}

ベストアンサー1

使用jq:

$ jq '.topics[0].topic |= "test_1"' file.json
{
  "topics": [
    {
      "topic": "test_1"
    }
  ],
  "version": 1
}

topicこれはJSONドキュメントを読み取り、配列の最初の要素エントリ値を文字列topicsに変更しますtest_1

変数に値(UTF-8でエンコードされている)がある場合:

$ val='Some value with "double quotes"'
$ jq --arg string "$val"  '.topics[0].topic |= $string' file.json
{
  "topics": [
    {
      "topic": "Some value with \"double quotes\""
    }
  ],
  "version": 1
}

パールの使用:

$ perl -MJSON -0777 -e '$h=decode_json(<>); $h->{topics}[0]{topic}="test_1"; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"test_1"}],"version":1}

変数の使用:

$ val='Some value with "double quotes"'
$ STRING=$val perl -MJSON -0777 -e '$string = $ENV{STRING}; utf8::decode $string; $h=decode_json(<>); $h->{topics}[0]{topic}=$string; print encode_json($h), "\n"' file.json
{"topics":[{"topic":"Some value with \"double quotes\""}],"version":1}

どちらもPerlJSONモジュールを使用してJSON文書をデコードし、変更する必要がある値を変更してから、再エンコードされたデータ構造を出力します。エラー処理は練習のままです。

2番目のコード部分では、挿入する値がSTRINGPerlコードに環境変数として渡されます。これは、「slurp」モードのファイルからJSON文書を読み取るためです-0777

おすすめ記事