sed解析中的变量

时间:2014-05-23 09:53:31

标签: json bash sed

我有一个关于json和使用sed解析的问题:

这是我在json中得到的:

response='{"found":"true","downloadLink":"http:\/\/www.addic7ed.com\/updated\/1\/86593\/2"}'

如果我使用它:

downloadLink=`echo $response | sed -e 's/^.*"downloadLink"[ ]*:[ ]*"//' -e 's/".*//'`

然后downloadLink将包含http:\/\/www.addic7ed.com\/updated\/1\/86593\/2

我尝试使用变量而不是downloadLink:

downloadLink=`echo $response | sed -e 's/^.*"$value"[ ]*:[ ]*"//' -e 's/".*//'`

但它似乎无法正常工作。你知道怎么做吗?

3 个答案:

答案 0 :(得分:1)

单引号未在bash中扩展。使用双引号并转义已经使用的引号: - 像这样:

echo $response | sed -e "s/^.*\"$value\"[ ]*:[ ]*\"//" -e 's/".*//'

答案 1 :(得分:1)

您可以捕获您感兴趣的值,而不是使用两个sed命令:

echo "$response" | sed -e "s/^.*\"$value\"\s*:\s*\"\([^\"]*\)\".*$/\1/"

\( \)的内容被捕获到变量\1中。我选择捕获[^\"]*(任意数量不是双引号的字符),这适用于您的示例。

我也使用\s“空格”字符类而不是[ ],因为我相信它更清晰。

测试出来:

$ echo "$response"
{"found":"true","downloadLink":"http:\/\/www.addic7ed.com\/updated\/1\/86593\/2"}
$ value=downloadLink
$ echo "$response" | sed -e "s/^.*\"$value\"\s*:\s*\"\([^\"]*\)\".*$/\1/"
http:\/\/www.addic7ed.com\/updated\/1\/86593\/2
$ value=found       
$ echo "$response" | sed -e "s/^.*\"$value\"\s*:\s*\"\([^\"]*\)\".*$/\1/"
true

顺便说一下,如果您使用的是bash,则可以使用echo $var | sed来避免<<<

sed -e "s/^.*\"$value\"\s*:\s*\"\([^\"]*\)\".*$/\1/" <<<"$response"

答案 2 :(得分:0)

变量不会在单引号内扩展。您可以使用像

这样的双引号
sed "s/$variable/newlaue/g" ...

但是你应该特别注意$variable的内容,因为sed会解释变量中的任何特殊字符(比如斜杠/)。