使用bash脚本

时间:2016-02-04 18:23:40

标签: regex bash parsing

我有时间尝试在bash脚本上获取文本的一部分(标题),但我不能。这是我的字符串:

link: <https://api.some.com/v1/monitor/zzsomeLongIdzz?access_token=xxSomeLongTokenxx==>; rel="monitor",<https://api.some.com/v1/services/xx/something-more/accounts/2345?access_token=xxSomeLongTokenxx==>; rel="parent"

这是一些格式,所以你可以更好地看到它:

link: 
<https://api.some.com/v1/monitor/zzsomeLongIdzz?access_token=xxSomeLongTokenxx==>; rel="monitor",
<https://api.some.com/v1/services/xx/something-more/accounts/2345?access_token=xxSomeLongTokenxx==>; rel="parent"

我需要第二部分,只需要url,基本上是,<>; rel="parent"之间的值,并将其分配给变量,例如:

my_url = $(echo $complete_header) <== some way to filter that

我不知道如何应用一些正则表达式或模式来提取我需要的数据。在过去,我使用jq来过滤json响应,如下所示:

error_message=$(echo $response | jq '.["errors"]|.[0]|.["message"]')

但不幸的是,对我来说,这不是一个json。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

使用以下代码:

#!/bin/bash
link='<https://api.some.com/v1/monitor/zzsomeLongIdzz?access_token=xxSomeLongTokenxx==>; rel="monitor",<https://api.some.com/v1/services/xx/something-more/accounts/2345?access_token=xxSomeLongTokenxx==>; rel="parent"'
re=",<([^>]+)>"
# look for ,< literally
# capture everything that is not a > one or more times ([^>]+)
# look for the closing > literally
my_url="test"
if [[ $link =~ $re ]]; then my_url=${BASH_REMATCH[1]}; fi
echo $my_url

请参阅a demo on ideone.com