Unix 两个值之间的Grep字符串
我有一个json数据,如下所示。需要grep该值并将其导出到新文件中Unix 两个值之间的Grep字符串,unix,awk,sed,grep,Unix,Awk,Sed,Grep,我有一个json数据,如下所示。需要grep该值并将其导出到新文件中 { "Data": [ "User": [ {"Name": "Solomon", "Age":20}, {"Name": "Absolom", "Age":30}, ] "Country": [ {
{
"Data":
[
"User": [
{"Name": "Solomon", "Age":20},
{"Name": "Absolom", "Age":30},
]
"Country": [
{"Name" : "US", "Resident" : "Permanent"},
{"Name" : "UK", "Resident" : "Temporary"}
]]}
预期结果
需要grep“User”的值并将其导出到新文件User.json
User.json
"User": [
{"Name": "Solomon", "Age":20},
{"Name": "Absolom", "Age":30},
]
再次需要grep“Country”并导出到Country.json
"Country": [
{"Name" : "US", "Resident" : "Permanent"},
{"Name" : "UK", "Resident" : "Temporary"}
]
Country.json
"Country": [
{"Name" : "US", "Resident" : "Permanent"},
{"Name" : "UK", "Resident" : "Temporary"}
]
正在尝试使用sed
,但结果不正确
sed -e 's/.*"User"\(.*\)].*/\1/' Data.json > Users.json
由于有许多特殊字符]/[/{/}
,因此无法确定如何正确地grep值并将其导出到新文件
{
"Data":
[
"User": [
{"Name": "Solomon", "Age":20},
{"Name": "Absolom", "Age":30},
]
"Country": [
{"Name" : "US", "Resident" : "Permanent"},
{"Name" : "UK", "Resident" : "Temporary"}
]]}
任何建议都会非常有用如果运气好,您可以使用GNU sed With
-z
选项,并过滤内容直到结束]
假设字符串中没有]
:
sed -z 's/.*\("User":[^]]*]\).*/\1\n/'
sed -z 's/.*\("Country":[^]]*]\).*/\1\n/'
您的输入不是有效的JSON,但是,对于解析JSON,您可以使用,例如,稍微修改您的输入,尝试以下方法:
$ echo '{
"Data":[
{
"User":[
{
"Name":"Solomon",
"Age":20
},
{
"Name":"Absolom",
"Age":30
}
],
"Country":[
{
"Name":"US",
"Resident":"Permanent"
},
{
"Name":"UK",
"Resident":"Temporary"
}
]
}
]
}'| jq -cr .'Data[] | with_entries(select(.key == "User"))';
它将输出(对于用户):
如果您将|jq-cr.'Data[]|与_条目一起使用(选择(.key==“Country”)代码>(适用于国家/地区)
这只是许多可能的方法中的一种,但我希望它能给您一个想法。使用json感知工具提取json数据。使用jq
。不,不能用sed编写json解析器。不,不想分割任何数据。我只需要grep并将其导出到一个新文件。另外,我不想使用jq
,因为我的linux发行版没有jq
,这不是一个有效的JSON值。数组不能有“key:”value“
形式的元素。是的,它不是有效的JOSN,原因是,我只想grep所需的记录并导出到新文件好的,但问题主体说它是json,这是错误的,可能会产生误导。sed-z
不起作用,我收到错误,因为sed-z非法选项
确定,安装GNU-sed
。您可以将输入中的所有换行符替换为某物,然后使用sed
,然后将这些字符替换回换行符。而且,如果您使用的是BSD或OSX,最好在问题中指定您的环境。