【问题标题】:not able to store sed output to variable无法将 sed 输出存储到变量
【发布时间】:2019-03-10 23:49:38
【问题描述】:

我是 bash 脚本的新手。 我收到一些 json 响应,但我从响应中只得到一个属性。我想将它保存到一个变量中,但它不起作用 token=$result |sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1 echo $token 它返回空行。 我不能使用 jq 或任何第三方工具。 请让我知道我缺少什么。

【问题讨论】:

    标签: json bash sed


    【解决方案1】:

    你的命令应该是:

    token=$(echo "$result" | sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1)
    

    您需要使用echo 在标准输出上打印变量的内容,并且您需要使用命令替换$( ) 将管道的输出分配给token

    始终鼓励引用您的变量,以避免出现空格和全局字符(如*)的问题。


    顺便说一句,请注意,您可能可以使用以下方式获得输出:

    token=$(jq -r .access_token <<<"$result")
    

    我知道你说过你不能使用jq,但它是一个独立的二进制文件(无需安装它)并以正确的方式处理你的 JSON,而不是任意文本。

    【讨论】:

      【解决方案2】:

      试试这个:

      token="$(sed -E -n -e 's/^.*access_token": ?"//p' <<<"$result" | cut -d'"' -f1)"
      

      说明:

      • token="$( script here )" 表示 $token 通过称为 command substituion 的过程设置为在 subshell 内运行的脚本的输出/结果
      • -Esed 中允许Extended Regular Expressions。我们想要这个,因为 JSON 通常在 : 之后和下一个 " 之前包含一个空格。我们在空格后使用? 告诉sed 空格可能存在也可能不存在
      • &lt;&lt;&lt;"$result" 是一个 herestring,它将数据作为标准输入输入到 sed,而不是文件。

      【讨论】:

      • 解释得很好。
      • sed -E 不“允许正则表达式”,它启用扩展正则表达式。没有-E,某些功能将不可用,但始终允许使用基本正则表达式。
      猜你喜欢
      • 2011-10-08
      • 2022-07-29
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2018-01-27
      • 2023-02-13
      相关资源
      最近更新 更多