Bash 从模式中提取值

Bash extracting value from pattern

[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]

假设我有上面的 json 数组,我想使用 sed/grep 提取我只知道名称的 id,例如 "dog"。我无法使用 json 工具,例如 jq。

由于输入的是 json 数据,因此我将使用 jq

echo '[{"id":"12345","name":"cat"},{"id":"67890","name":"dog"}]' \
    | jq --raw-output '.[] | select(.name=="dog") | .id'

如果它在服务器上不可用,请安装它。另一种方法可能是使用编程语言,如 pythonrubyperlphp。如果你愿意,我可以用其中一种语言举一个例子。如果你的服务器上都没有,那么服务器安装不符合你的要求。

按照您的要求,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)

如果您想像 jq 示例中那样从 stdin 读取数据,请使用:

import sys
import json

data=sys.stdin.read()
for item in json.loads(data):
    if item['name'] == "dog":
        print(item['id'])
        exit(0)

(python 支持者可能会责怪我,因为代码太冗长了,我是一个 python 菜鸟!;))

如果您想在没有 jq 的情况下执行此操作,这里有一个混合使用 sed 和 grep 的解决方案:

sed 's/},{/}\n{/g' inputfile |grep '"name":"dog"' |sed 's/.*"id":"\([0-9]*\)".*//g

第一部分sed 's/},{/}\n{/g' inputfile将每对夫妇放在单独的一行中。

第二部分grep '"name":"dog"'提取您要查找的id所在的行(将dog替换为合适的id)

第三部分sed 's/.*"id":"\([0-9]*\)".*//g提取行中id的值

确保您使用的是 gnu 版本的 sed。

希望对您有所帮助!