如何在bash中将json字符串转换为单个字符数组?

时间:2019-11-22 17:57:04

标签: arrays json bash scripting

我有一个json字符串,我需要将其转换为用于传递密码的数组。当前问题是我需要为许多用户执行此操作

当前json看起来像是从

生成的
[
   {
        "password": "Password1",
        "loginId": "USER1"
   }
]

我需要将其更改为此

[ 
   { 
      "password":[ 
         "P",
         "a",
         "s",
         "s",
         "w",
         "o",
         "r",
         "d",
         "1"
      ],
      "loginId":"USER1"
   }
]

我更愿意以bash的方式执行此操作,但是如果有人有其他选择,那么我会接受任何事情。

3 个答案:

答案 0 :(得分:2)

jq中,用空字符串分割字符串会根据需要生成一个字符数组。

jq '.[].password |= split("")' file

Online demo at jqplay.org

答案 1 :(得分:1)

通过Xidel,您可以使用XPath / XQuery函数x:cps()两次将字符串转换为数组,并使用map:put()更新JSON。

xidel -s input.json -e '[$json()/map:put(.,"password",x:cps(x:cps(password)))]'
[
  {
    "password": [
      "P",
      "a",
      "s",
      "s",
      "w",
      "o",
      "r",
      "d",
      "1"
    ],
    "loginId": "USER1"
  }
]

Online xidelcgi demo

答案 2 :(得分:0)

通过Bash处理JSON是一个坏主意。 Awk一点也不好,但是可以做到:

structure(list(test1 = c(0.12, 0.2, 0.55, 0.22, 0.19, 0.17, 0.15, 
0.12, 0.32, 0.23, 0.32, 0.23), test2 = c(0.15, 0.12, 0.32, 0.23, 
0.12, 0.2, 0.55, 0.22, 0.12, 0.2, 0.55, 0.22), test3 = c(0.07, 
0.01, 0, 0.13, 0.16, 0.78, 0.98, 0.1, 0.5, 0.3, 0.4, 0.5), test4 = c(0.23, 
0.12, 0.2, 0.2, 0.55, 0.22, 0.12, 0.2, 0.55, 0.22, 0.55, 0.42
), out_test1 = c(0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1), out_test2 = c(0, 
0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1), out_test3 = c(0, 0, 0, 0, 0, 
1, 1, 0, 1, 1, 1, 1), out_test4 = c(1, 0, 1, 1, 1, 1, 0, 1, 1, 
1, 1, 1)), row.names = c(NA, -12L), class = c("tbl_df", "tbl", 
"data.frame"))

另一方面。我认为正确的工具实际上是Python 3:

awk -F':' '
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
!/"password"/ {
    print $0
}
/"password"/ {
    found=1;
    print $1 ":["
    password = $2
    gsub(/"|,/, " ", password)
    split(trim(password),letters,"")
    for(c=1; c <= length(letters); c++ ) {
        printf("\t\t\"%s\"",letters[c])
        if (c != length(letters)) {
            printf(",\n")
        }else{
            printf("\n\t\t]\n")
        }
    }
}
' input.txt

希望这会有所帮助!