[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]
假设我上面有json数组,我想使用sed / grep来提取我只知道名字的id,例如" dog"。我不能使用jq等工具。
答案 0 :(得分:2)
由于输入是json数据,我会使用jq
:
echo '[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]' \
| jq --raw-output '.[] | select(.name=="dog") | .id'
如果服务器上没有,请安装它。另一种方法可能是使用python
,ruby
,perl
,php
等编程语言。如果您愿意,我可以用其中一种语言提供示例。如果它们在您的服务器上都不可用,则服务器安装不符合您的要求。
正如您所要求的,python
中有一个简单的实现:
import json
data='[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]'
for item in json.loads(data):
if item['name'] == "dog":
print(item['id'])
exit(0)
如果您想在stdin
示例中阅读jq
,请使用此代码:
import sys
import json
data=sys.stdin.read()
for item in json.loads(data):
if item['name'] == "dog":
print(item['id'])
exit(0)
(蟒蛇可能会怪我,因为代码太冗长,我是一个蟒蛇菜鸟!))
答案 1 :(得分:0)
如果你想在没有jq的情况下这样做,这里有一个混合了sed和grep的解决方案:
sed 's/},{/}\n{/g' inputfile |grep '"name":"dog"' |sed 's/.*"id":"\([0-9]*\)".*/\1/g
第一部分sed 's/},{/}\n{/g' inputfile
将每对夫妻分开。
第二部分grep '"name":"dog"'
提取您正在寻找的ID的行(用适当的id替换dog)
第三部分sed 's/.*"id":"\([0-9]*\)".*/\1/g
从行中提取id的值。
确保使用sed的gnu版本。
希望有所帮助!