因为平时多是利用脚本对JSON文件进行一些读取、写入操作。所以,本文重点讨论利用sed、grep、awk对JSON进行状态获取、写入。
JSON实例:
{
"name": "melon",
"age": 18,
"gender": "man",
"grade":{
"math": 98,
"chinese": 90,
"english": 80
},
"passStatus": true
}
1. 在JSON中第10行后添加一行
sed -i '10a "location": "Xi An"' status.json
-i: 表示直接对指定的文件进行操作,而不是只将操作结果输出到console;
10a: 表示在第10行后添加后续字符串;
输出结果:
{
"name": "melon",
< 省略部分 >
"passStatus": true
"location": "Xi An"
}
可以看出第10行后新增了"location": “Xi An”,但由于是在最后一行新增,前一行最后没加, 造成格式错误,并且最后一行前没有空格,造成格式不统一。
字符 | 功能 | 备注 |
---|---|---|
^ | 锚点行首的符合条件的内容,用法格式"^pattern" | |
$ | 锚点行尾的符合条件的内容,用法格式"pattern$" | |
. | 匹配任意单个字符 | 多个.组合也就会匹配多个字符 |
.* | 匹配任意长度的任意字符 | 就是匹配指定之前(或之后)的任意字符 |
.* | 匹配任意长度的任意字符 | 就是匹配指定之前(或之后)的任意字符 |
[0-9] | 所有数字 | |
[a-z] | 所有小写字母 | |
[A-Z] | 所有大写字母 |
2. 对JSON中指定字符进行替换
sed -i 's/"passStatus": true/"passStatus": true,/g' status.json
sed -i 's/"location":/ "location":/g' status.json
#sed -i "s/\"passStatus\": true/\"passStatus\": true,/g" status.json
#sed -i "s/\"location\":/****\"location\":/g" status.json
s///g: 格式为 ‘s/要被取代的字串/新的字串/g’,表示以行为单位进行数据的搜寻并取代。注释的两行为"s///g",中间的特殊字符需要进行转义。
输出结果:
{
"name": "melon",
<省略的部分>
"passStatus": true,
"location": "Xi An"
}
3. 删除第11行,并将第10行最后的,去掉
sed -i '11d' status.json
sed -i 's/"passStatus": true,/"passStatus": true/g' status.json
4. 获取年龄值
age_val=`cat status.json | grep age | sed 's/"age"://g' | sed 's/,//g'`
grep age : 只选取含有age的行; — “age”: 18,
sed ‘s/“age”😕/g’ : 将 一行中所有(g参数)的"age": 删除 — 18,
sed ‘s/,//g’ : 将18,中的,删除 — 18
age_val=`cat status.json | grep age | awk '{print $2}' | sed 's/,//g'`
awk ‘{print $2}’ : 以空格为分隔符,输出"age": 18,中的第二列 — 18,
sed ‘s/,//g’ : 将18,中的,删除 — 18
5. 向指定内容的那一行后添加内容
在含有name每一行后添加 _1。
sed '/name/a_1' status.json
输出结果:
{
"name": "melon",
_1
<省略部分>
"passStatus": true
}
6. 把特定内容前的字符全部替换成空
sed 's/^.*://g' status.json
^.*: 表示将:前的所有内容,^匹配行首,.*表示指定内容前的所有字符;
输出结果:
{
"melon",
18,
"man",
{
98,
90,
80
},
true
}
7.把指定内容后的所有字符替换成空
sed 's/:.*$//g' status.json
{
"name"
"age"
"gender"
"grade"
"math"
"chinese"
"english"
},
"passStatus"
}
:.*$ 表示把:之后所有字符替换成空,.*表示:之后的所有字符,$表示匹配到行尾。
8. 写入数学值,事先不确定值
sed 's/"math":.*$/"math": 100,/g' status.json
输出结果:
{
<省略部分>
"grade":{
"math": 100,
"chinese": 90,
"english": 80
},
"passStatus": true
}
9. 将:及其之后两个字符替换为***
sed 's/:../**/g' status.json
输出结果:
替换前:"name": "melon",
替换后:"name"**melon",
:…表示将:及其之后的任意两个字符替换为**