ファイル内の二重引用符で囲まれた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

答え2

match [A-Za-z_](ほとんどのロケールで英語の文字とアンダースコアよりもはるかに一致します)を使用する代わりに、[^"]次のようにします。削除する"(しかし、質問の例には、タイトル名の後の閉じた引用符でjson引用符(、、U + 0022、)の代わりに(U + 201D、)があります。元のサンプルファイルではそうでないと仮定します。これにより、jsonが無効になります。 ):RIGHT DOUBLE QUOTATION MARK"QUOTATION MARK

sed 's/\("topic": "\)[^"]*/\1test_1/' < file.json

(トピック名の置換が正しくJSONでエンコードされていることを確認するのはユーザーの責任です。つまり、UTF-8文字セット、エンコードされた制御文字(改行など)、およびで\nエンコード"されます\"

答え3

sed -i 's/\(topic\": "\)[A-Za-z_]*/\1test_1/' file.json

関連情報