首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用awk或sed替换模式范围

如何使用awk或sed替换模式范围
EN

Stack Overflow用户
提问于 2016-10-22 15:58:30
回答 2查看 141关注 0票数 0

有些人格式化他们的JSON文件,其中所有的主要数据元素都在数组中。我希望将数组元素提升为json对象。

换句话说..。我想获取任何像这样的通用文本文件:

{“食品”:{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,半杯,6矛“,”食品“:”芦笋“},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,半杯”,“食品”:“Beans,绿色”},{“fgid”:“vf”,“fgcat_id”:“fgcat_id”,"srvg_sz":"125 mL,半杯煮熟“,”食物“:”Bok/大白菜“},{"fgid":"vf",”vf“,"fgcat_id":"1",”srvg_sz“:”125号mL,半杯“,”食品“:”椰菜“},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,0.5杯,4个豆芽”,“srvg_sz”:“布鲁塞尔豆芽”}{"fgid":"vf","fgcat_id":"2","srvg_sz":"125 mL,半杯,1大号“,”食品“:”胡萝卜“}

并找到替换从first "{"first“[]的文本范围,并将其替换为"{{”和(在单独的命令中?)在结尾处替换"]“,使其看起来如下:

{{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,半杯,6矛“,”食品“:”芦笋“},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,半杯”,“食品”:“Beans,绿色”},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL,“半杯煮熟“、”食物“:”博彩/大白菜“}、{”fgid“:”vf“、"fgcat_id":"1”、"srvg_sz":"125 mL、半杯“、”食品“:”花椰菜“}、{”fgid“、”fgcat_id“、”1“、”srvg_sz“、”125 mL、0.5杯、4枝“、”食物“:”布鲁塞尔芽“}、{"fgid":"vf","fgcat_id":"2","srvg_sz":"125 mL,半杯,1大号“,”食物“:”胡萝卜“}

但我希望这是任何类似的文件,所以我不知道"foods“文本的长度(或者有时数组前面还有其他元素,我也想在第一个"[”开始“之前删除)。这将帮助我处理来自加拿大政府的Open,因为所有的JSON都在一个数组中的一个对象中。谢谢。我很乐意使用sed或awk。

EN

回答 2

Stack Overflow用户

发布于 2016-10-22 16:35:37

像这样的东西会起作用的我想:

代码语言:javascript
复制
#!/usr/bin/env perl

use strict;
use warnings;
use JSON;
use Data::Dumper;

my $json_str =
  '{"foods":[{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup, 6 spears","food":"Asparagus"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup","food":"Beans, green"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup cooked","food":"Bok choy/Chinese cabbage (Choi sum)"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup","food":"Broccoli"},{"fgid":"vf","fgcat_id":"1","srvg_sz":"125 mL, ½ cup, 4 sprouts","food":"Brussels sprouts"},{"fgid":"vf","fgcat_id":"2","srvg_sz":"125 mL, ½ cup, 1 large","food":"Carrots"}]}';

my $json_obj = from_json($json_str);
print Dumper \$json_obj;
my $json_arr = $json_obj -> {foods}; 
print to_json ( $json_arr, { pretty => 1 } );

实际上,我确信您的第二个示例实际上不是有效的JSON,因为如果不使用[],您就不能执行“某种数组”。

票数 1
EN

Stack Overflow用户

发布于 2016-10-23 21:10:39

试试这个-

代码语言:javascript
复制
sed -e '1s/{/{{/' -e '$s/\(.*\)]/\1/'

下面的解释是:-e用于使用多个sed操作,1s是选择第一行,$s是选择最后一行(.*)]/\1is替换最后出现的[。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40194132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档