【问题标题】:Bash extract string from JSON output and save it into ArrayBash 从 JSON 输出中提取字符串并将其保存到数组中
【发布时间】:2017-05-14 23:21:47
【问题描述】:

我正在尝试从一个字符串中提取多个子字符串,我想将这些子字符串保存在一个数组中,所以我想到了使用循环,但我真的是 bash 脚本的新手。

原来的字符串是这样的:

   {  
   "groups":[  
      {  
         "group":"",
         "favourites":[  
            {  
               "category":"",
               "longitude":1.0812308,
               "latitude":49.4304904,
               "test":"",
               "color":0,
               "name":"Place Henri Gadeau de Kerville, Centre Ville Rive Gauche"
            },
            {  
               "category":"",
               "longitude":1.940849,
               "latitude":48.57248,
               "test":"",
               "color":0,
               "name":"Rue Charles de Gaulle, Saint-Arnoult-en-Yvelines"
            },
            {  
               "category":"",
               "longitude":1.9358053,
               "latitude":48.570592,
               "test":"",
               "color":0,
               "name":"Rue des Remparts, Saint-Arnoult-en-Yvelines"
            },
            {  
               "category":"",
               "longitude":1.0856655,
               "latitude":49.4291327,
               "test":"",
               "color":0,
               "name":"Rue Marie Duboccage (Saint-Sever), Rouen"
            },
            {  
               "category":"",
               "longitude":1.0845655,
               "latitude":49.4251747,
               "test":"",
               "color":0,
               "name":"Rue Octave Crutel, Rouen"
            }
         ],
         "color":0
      }
   ]
}

所需的输出是一个数组,其名称为 url 模式,来自“name”标签,例如:

Array[0]=Place%20Henri%20Gadeau%20de%20Kerville%2C%20Centre%20Ville%20Rive%20Gauche;
Array[1]=Rue%20Charles%20de%20Gaulle%2C%20Saint-Arnoult-en-Yvelines;
Array[2]=Rue%20des%20Remparts%2C%20Saint-Arnoult-en-Yvelines;
Array[3]=Rue%20Marie%20Duboccage%20(Saint-Sever)%2C%20Rouen;
Array[4]=Rue%20Octave%20Crutel%2C%20Rouen;
...

为了将数组的值保存在另一个文件中,然后使用它们。 我试过grep

grep -o '^\"name\":.*\},$' $var 

但我不能得到一个好的结果。

【问题讨论】:

  • 您的输入看起来像一个JSON 字符串,请使用适当的JSON 解析工具,如jq
  • 是的,它来自JSON,但是我必须从 sqlite 查询中获取输入,然后对其进行处理,您认为我仍然可以使用 jq 工具制作脚本吗?
  • 如果你可以下载安装jq,我可以在里面提供解决方案,为什么数组中只有3个元素?剩下的呢?
  • 最后的三个点(...)的意思是“其他的等等”,是的,我可以安装它让你更容易
  • 能不能把另外两条也发一下,因为涉及到(,需要确认一下你想怎么弄

标签: bash loops awk sed grep


【解决方案1】:

bash 中一个简单的循环,使用JSON 解析工具jq 和进程替换

#!/bin/bash

jsonArray=()
while IFS= read -r line
do
    jsonString="${line// /%20}"           # Replace blank-spaces with '%20'
    jsonString="${jsonString//,/%2C}"     # Replace ',' with empty '%2C'
    jsonString+=";"                       # Append a ';' at end of string
    jsonArray+=("$jsonString")            # Add it to the array
done< <(jq -r '.groups[].favourites[].name' newfile)

printf "%s\n" "${jsonArray[@]}"           # "${jsonArray[0]}","${jsonArray[1]}"...

在我的示例中,我在文件中使用了字符串,为您的情况替换该行

done< <(jq -r '.groups[].favourites[].name' newfile)

使用产生JSON 输出的实际命令

done < <( json-cmd | jq -r '.groups[].favourites[].name')

在运行脚本时

$ bash script.sh
Place%20Henri%20Gadeau%20de%20Kerville%2C%20Centre%20Ville%20Rive%20Gauche;
Rue%20Charles%20de%20Gaulle%2C%20Saint-Arnoult-en-Yvelines;
Rue%20des%20Remparts%2C%20Saint-Arnoult-en-Yvelines;
Rue%20Marie%20Duboccage%20(Saint-Sever)%2C%20Rouen;
Rue%20Octave%20Crutel%2C%20Rouen;

【讨论】:

  • 它就像一个魅力,非常感谢,从一开始我就在考虑使用grep, sed or awk,但这种方法要好得多
  • @user7358525:它们不是解析JSON 的正确工具,jq 是你的朋友。很高兴您发现它很有用。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 2019-11-10
  • 2021-12-23
  • 1970-01-01
  • 2012-11-09
  • 2020-11-11
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多