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'
如果它在服务器上不可用,请安装它。另一种方法可能是使用编程语言,如 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)
如果您想像 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。
希望对您有所帮助!
[{"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'
如果它在服务器上不可用,请安装它。另一种方法可能是使用编程语言,如 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)
如果您想像 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。
希望对您有所帮助!