我有一个关于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/".*//'`
但它似乎无法正常工作。你知道怎么做吗?
答案 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会解释变量中的任何特殊字符(比如斜杠/
)。