如何将编辑器显示的大文本文件的内容提取为一行

时间:2016-12-30 23:33:49

标签: text sed grep

我想从大型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}, {"license . . .

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

3 个答案:

答案 0 :(得分:2)

jq是您要用于本机解析JSON的工具。如果它是结构化格式,请不要将其视为随机文本。

$ 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记录,您可能会执行以下操作:

jq 'select(.file_name|contains("000000523573"))' < input.json

这里的符号......解释时间比单个SO答案更有意义。如果您对使用此工具感兴趣,请查看JQ查询结构。

答案 1 :(得分:0)

<强> data.txt中:

{"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}

<强>命令:

cat data.txt | sed 's/\},\s{/}\n{/g' | grep "000000523573"

<强>输出:

{"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}

答案 2 :(得分:0)

正如ghoti's answer所示,jq绝对是你最好的选择。

至于您的确切问题(&#34;搜索单词000000523573并打印前面的100个字符和后面的200个字符&#34;):您可以使用grep -o,如下所示:

grep -Eo '.{100}000000523573.{200}' infile

这有一些缺点:

  • 如果000000523573早于文件开头的100个字符或者晚于200个字符,则会被忽略。
  • 如果两次出现之间的距离小于300个字符,则后面的出现将被忽略(grep -o不考虑重叠出现次数。)

通过在发生之前/之后将要求放宽到&#34;打印最多 ,可以有所缓解

grep -Eo '.{,100}000000523573.{,200}' infile

但是,再一次,正确的方法是使用jq。另请参阅this question about command line JSON parsing