利用sed、grep、awk对JSON进行状态获取、写入

因为平时多是利用脚本对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",

:…表示将:及其之后的任意两个字符替换为**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值