如果你有一个能够执行Perl兼容正则表达式(PCRE)的grep:
$ grep -Po '"id": *\K"[^"]*"' infile.json
"4dCYd4W9i6gHQHvd"
-P
启用 PCRE
-o
只保留匹配的内容
"id": *
匹配 "id"
和任意数量的空格
\K
抛弃其左边所有内容 ("可变长正向后查找")
"[^"]*"
匹配两个引号之间的所有非引号字符
如果你的 grep 不能做到这一点,你可以使用
$ grep -o '"id": *"[^"]*"' infile.json | grep -o '"[^"]*"$'
"4dCYd4W9i6gHQHvd"
这个命令两次使用了grep。第一个命令的结果是"id": "4dCYd4W9i6gHQHvd"
;第二个命令删除了除一对括号和它们之间非括号字符以外的所有内容,在字符串末尾锚定 ($
)。
但是,正如指出的那样,您不应该使用grep来完成此操作,而是应该使用可以解析JSON的工具,例如jq:
$ jq '.data.id' infile.json
"4dCYd4W9i6gHQHvd"
这只是对data
对象中的id
键的简单过滤器。为了去掉双引号,您可以使用-r
(“原始输出”)选项:
$ jq -r '.data.id' infile.json
4dCYd4W9i6gHQHvd
jq 也可以将你的 JSON 数据整齐地打印出来:
$ jq . infile.json
{
"data": {
"name": "test",
"id": "4dCYd4W9i6gHQHvd",
"domains": [
"www.test.domain.com",
"test.domain.com"
],
"serverid": "bbBdbbHF8PajW221",
"ssl": null,
"runtime": "php5.6",
"sysuserid": "4gm4K3lUerbSPfxz",
"datecreated": 1474597357
},
"actionid": "WXVAAHQDCSILMYTV"
}
grep -o -P '"id":.*?",' json.file |sed 's/"\|,//g'
命令,这应该会有所帮助...但如果您使用一些json感知工具会更好。 - P....data:
的内容不应该用[ ]
括起来吗? - Inian