Sed

替換文件中雙引號中的第三個單詞

  • December 22, 2019

這是json我們要編輯的文件

範例 1

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

範例 2

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

我們想用其他單詞替換該行中的第三個topics單詞(通過 sed 或 perl one liner)

關於範例 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
}

使用jq

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

這將讀取 JSON 文件並將topic數組的第一個元素的條目的值修改topics為 string 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:

$ 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 文件進行解碼,更改需要更改的值,然後輸出重新編碼的資料結構。錯誤處理留作練習。

對於第二段程式碼,要插入的值作為環境變數 傳遞STRING到 Perl 程式碼中。這是由於在“slurp”模式下使用-0777.

引用自:https://unix.stackexchange.com/questions/558432