これが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番目のコード部分では、挿入する値がSTRING
Perlコードに環境変数として渡されます。これは、「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