简单的bash获取字符串

时间:2016-06-03 09:13:58

标签: linux bash

我有这个文字,并且存储在$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解析器,必须使用字符串操作!

3 个答案:

答案 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