Sed

在 JSON 文件中的字元串匹配後添加新行

  • January 18, 2022

我需要幫助來完成以下任務。

在 JSON 文件中,我有一個類似下面的部分

"Principal": {
               "AWS": [
                   "arn:aws:iam::12345677890:root",
                   "arn:aws:iam::12345677891:root",

我需要在哪裡找到一個字元串“AWS”:[並且它應該添加一個帶有“arn:aws:iam::33333333333:root”的新行,所以更新的json內容應該是這樣的。

"Principal": {
               "AWS": [
                   "arn:aws:iam::33333333333:root",
                   "arn:aws:iam::12345677890:root",
                   "arn:aws:iam::12345677891:root",

如何用 sed 做到這一點?

假設Principal是您的 JSON 文件中的頂級對象,並且您想要添加一些字元串,保存在 shell 變數entry中,到下面的(開始)AWS數組:

entry='arn:aws:iam::33333333333:root'

jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json

jq表達式將保存在jq變數中的字元串添加到數組的開頭,$e使用 分配--arg到數組的開頭(它AWS使用|=新數組更新/重寫數組,從添加$e的元素開始,然後是原始數組)。

將元素添加到數組的末尾會稍微容易一些,並且可能更有效(因為不需要重寫整個數組),

jq --arg e "$entry" '.Principal.AWS += [$e]' file.json

測試:

$ cat file.json
{
 "Principal": {
   "AWS": [
     "arn:aws:iam::12345677890:root",
     "arn:aws:iam::12345677891:root"
   ]
 }
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
 "Principal": {
   "AWS": [
     "arn:aws:iam::33333333333:root",
     "arn:aws:iam::12345677890:root",
     "arn:aws:iam::12345677891:root"
   ]
 }
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
 "Principal": {
   "AWS": [
     "arn:aws:iam::12345677890:root",
     "arn:aws:iam::12345677891:root",
     "arn:aws:iam::33333333333:root"
   ]
 }
}

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