首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取只对编辑器显示为一行的大型文本文件的内容

如何提取只对编辑器显示为一行的大型文本文件的内容
EN

Stack Overflow用户
提问于 2016-12-31 07:33:49
回答 3查看 65关注 0票数 0

我想从大型JSON文件中提取内容,这些文件在编辑器中显示为一行(因此我不能以行为单位进行操作),例如

代码语言:javascript
复制
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}, {"license . . .

例如,有没有办法(sed,grep,...?)我可以搜索单词000000523573,并打印该单词出现的前面的100个字符和后面的200个字符。

EN

回答 3

Stack Overflow用户

发布于 2016-12-31 07:50:12

是您想要在本地解析JSON的工具。如果它是结构化的格式,不要把它当作随机的文本。

代码语言:javascript
复制
$ jq . < input.json
{
  "license": 2,
  "file_name": "COCO_test2014_000000523573.jpg",
  "coco_url": "http://mscoco.org/images/523573",
  "height": 500,
  "width": 423,
  "date_captured": "2013-11-14 12:21:59",
  "id": 523573
}
$ jq .height < input.json
500

要在file_name记录中搜索包含特定字符串的特定JSON记录,可以执行以下操作:

代码语言:javascript
复制
jq 'select(.file_name|contains("000000523573"))' < input.json

这里的符号是..。对于一个简单的答案来说,解释的时间比合理的要长。如果您对使用此工具感兴趣,请务必查看JQ查询结构。

票数 2
EN

Stack Overflow用户

发布于 2016-12-31 07:45:00

data.txt:

代码语言:javascript
复制
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}, {"license": 2, "file_name": "COCO_test2014_000000523574.jpg", "coco_url": "http://mscoco.org/images/523574", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523574}

命令:

代码语言:javascript
复制
cat data.txt | sed 's/\},\s{/}\n{/g' | grep "000000523573"

输出:

代码语言:javascript
复制
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}
票数 0
EN

Stack Overflow用户

发布于 2017-01-01 03:39:01

正如在ghoti's answer中所展示的,jq绝对是您最好的选择。

至于您的确切问题(“搜索单词000000523573并打印前面的100个字符和后面的200个字符”):您可以按如下方式使用grep -o

代码语言:javascript
复制
grep -Eo '.{100}000000523573.{200}' infile

这有几个缺点:

  • 如果000000523573出现在距文件开头的100个字符之前或晚于文件结尾的200个字符,则将忽略它。
  • 如果两个实例之间的距离小于300个字符,则将忽略较晚的实例(重叠的实例不会被grep -o).

考虑在内

通过放宽“在出现之前/之后最多打印100/200个字符”的要求,可以在一定程度上缓解这些问题:

代码语言:javascript
复制
grep -Eo '.{,100}000000523573.{,200}' infile

但是,同样,正确的方法是使用jq。另请参见this question about command line JSON parsing

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

https://stackoverflow.com/questions/41404009

复制
相关文章

相似问题

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