Shell脚本中处理json

假设一个APK通过平台给Android设备下发了一堆素材(.jpg),并且下发了包含一个集合、存储了下发素材信息的json字符串的文件,每次下发的图片名不固定更新,现通过shell脚本来获取第一个filename文件名。

假设json字符串如下:

[{"kind":"p","filename":"0000-000062240de7.jpg","duration":"5","type":"jpg","marker":""},

{"kind":"p","filename":"0000-0000630a3e20.jpg","duration":"5","type":"jpg","marker":""},

{"kind":"p","filename":"ffff-ffffdb9ce79c.jpg","duration":"5","type":"jpg","marker":""},

{"kind":"v","filename":"ffff-ffff85219fa1.mp4","duration":"15","type":"mp4","marker":""}]

如下:

dataline=$(cat /***/a.txt)

#读取/***/a.txt中内容

data2=${dataline#*filename\":\"}

#删除最左边的filename以及其左边的":"内容

data3=${data2%%\",\"duration*}

#删除最左边的一个","duration以及其右边的内容

echo $data3

#输出



如果支持sed命令的话,下面的命令更加合理:

cat /***/a.txt | sed 's/,/\n/g' | grep "filename" | sed 's/:/\n/g' | sed '1d' | sed '/^"filename/,$d'


1)第一个sed命令的意思是将json数据中的“,”替换为换行符“\n”,这样该串数据就变为每一行一个字段的内容,即按逗号分隔数据串。

2)第二个grep命令的意思是查找“filename”关键字,并单列出来。

3)第三个sed命令的意思是将(2)中的结果再次按冒号“:”进行分隔。

4)第四个sed命令的意思是将(3)中的结果,删除第一行内容,即删除“filename”行。

5)最后一个sed命令的意思是将最后的花括号“第二个filename以后的所有内容”删除,最终得到我们想要的值。


相比于用shell脚本去解析某个字符串的值,java中使用bufferedreader.readline()就能很简单实现,但因为一些现实因素,不得不采用shell脚本的方式去暂时实现。

发布于 2020-11-06 15:21