【问题标题】:Variable in sed parsingsed解析中的变量
【发布时间】:2014-07-12 15:05:23
【问题描述】:

我有一个关于 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/".*//'`

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

【问题讨论】:

  • 你想从 sed 得到什么输出?
  • 我不确定你的任何作业是如何进行的;在 bash 中,变量名和 = 之间不能有空格。
  • 是的,抱歉,我错误地编辑了我的副本/粘贴。

标签: json bash sed


【解决方案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】:

单引号在 bash 中不展开。使用双引号并转义那些已经使用过的: - 像这样:

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

【讨论】:

    【解决方案3】:

    变量不在单引号内展开。你可以使用像

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

    但是您应该特别注意$variable 的内容,因为在这个特定示例中,sed 会解释变量中的任何特殊字符(如斜线/)。

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2020-06-05
      • 2019-04-06
      • 1970-01-01
      相关资源
      最近更新 更多