我有一个文件:
loggedIn(){
return tokenNotExpired();
我想提取{
"test_data": [
{
"id": "1",
"pm": "30",
"mp": "40"
}
],
"test": [
"id",
"pm",
"mp"
]
}
。输出:
test_data
我尝试这个命令:"test_data": [
{
"id": "1",
"pm": "30",
"mp": "40"
}
],
但它不起作用。一个想法?
谢谢!
答案 0 :(得分:2)
jq
似乎是正确的工具:
$ jq '.|{test_data:.test_data}' filename
{
"test_data": [
{
"id": "1",
"pm": "30",
"mp": "40"
}
]
}
答案 1 :(得分:1)
解决方案第一: 使用sed
sed -n '/"test_data"/,/],/p' Input_file
根据OP,OR: ,OP需要在一行匹配后追加字符串/数据:
sed -n '/"test_data"/,/],/p;/],/s/$/"test"/p' Input_file
OR2: 如果想要将其他文件的内容添加到匹配项中,则以下内容可能有所帮助:
sed -n '/"test_data"/,/],/p;/],/r another_file' Input_file
解决方案第二: 以下简单awk
可能对您有帮助。
awk '/test_data/, /],/' Input_file
输出如下。
"test_data": [
{
"id": "1",
"pm": "30",
"mp": "40"
}
],
以上解决方案的逻辑:
对于 sed
:-n
中的sed
选项将关闭任何行的打印,直到明确提及为打印它,然后执行/"test_data"/,/],/
我让sed
知道我需要从test_data获取数据直到,/]
并在此之后提及p
将确保这些行来自这个范围的是这里打印/
awk
:只需提及/"test_data"/,/],/
的范围,并且不提及任何操作,以便当任何行进入此范围条件时变为真并且由于没有提到任何动作,所以默认情况下会打印该行。
答案 2 :(得分:0)
您可以尝试使用gnu
csplit -s -z infile %test_data%-1 /],/1;rm xx01;echo "Add Text here" >> xx00;cat xx00
答案 3 :(得分:0)
正确的方法是 jq
工具:
jq 'del(.test)' inputfile
输出:
{
"test_data": [
{
"id": "1",
"pm": "30",
"mp": "40"
}
]
}