我有这个文字,并且存储在$hello
:
"id":"1234"
如何找到ID,然后只获取数字?
字符串中会有很多其他文字。
整个字符串是: 在说完之后:
{"self":"http://xxxxx:8081/rest/api/latest/version/1234","id":"1234","description":"desc","name":"vi1teast","archived":false,"released":false,"releaseDate":"2016-02-06","overdue":true,"userReleaseDate":"06/Feb/16","projectId":xxxxx}
我不能使用任何JSON解析器,必须使用字符串操作!
答案 0 :(得分:3)
如果要解析JSON,请使用jq
!
$ jq '.id' file
"1234"
如果您不想获得引号,请使用-r
:
$ jq -r '.id' file
1234
从手册:
--raw-output / -r
:使用此选项,如果过滤器的结果是字符串,那么它将是 直接写入标准输出而不是格式化为 带引号的JSON字符串。这对于使jq过滤器说话很有用 到非基于JSON的系统。
注意我必须调整你的JSON并编写"projectId":"xxxxx"
以便它是有效的。
答案 1 :(得分:2)
如果你只想获得id并且可以确保它只包含数字,你可以使用这样的纯bash解决方案。它将使用bash regex和BASH_REMATCH
来引用捕获组。
#!/bin/bash
str='{"self":"http://xxxxx:8081/rest/api/latest/version/1234","id":"1234","description":"desc","name":"vi1teast","archived":false,"released":false,"releaseDate":"2016-02-06","overdue":true,"userReleaseDate":"06/Feb/16","projectId":xxxxx}'
if [[ "$str" =~ ^.*\"id\":\"([0-9]*)\".*$ ]];
then
echo ${BASH_REMATCH[1]} ;
else
echo "Not propper format";
fi
这将输出所需的1234
。
你也可以缩短它:
#short version
[[ "$str" =~ ^.*\"id\":\"([0-9]*)\".*$ ]] && id=${BASH_REMATCH[1]}
echo $id
答案 2 :(得分:1)
如果你不能使用解析器,试试这个sed:
$ sed 's/.*"id":"\([0-9]\+\)".*/\1/' <<< "$hello"
1234