【问题标题】:Remove Double Quotes from a String in bash从bash中的字符串中删除双引号
【发布时间】:2020-03-05 18:57:12
【问题描述】:

我正在尝试从 Git 获取单个文件。当我使用硬编码值运行我的 git 命令时,它可以工作。但是,当我使用变量运行它时,它会中断。我怀疑这是由于以某种方式在我的变量周围放置了双引号。我尝试了许多命令来从字符串中删除双引号,但它们似乎都不起作用。

我基本上是想在我的 git 命令中使用 filePath 变量,周围没有双引号。

#!/usr/bin/env bash
 #reads the JSON value of the file-path key. 
 #file path key is "home/docs" (quotes included)
filePath=$(grep -o '"file-path": *"[^"]*"' ../package.json | grep -o '"[^"]*"$')
git archive --remote=git@git.SOME_URL.com:help/docs.git HEAD $filePath | tar -x

【问题讨论】:

  • 停止使用grep解析JSON。使用像jq 这样为JSON设计的工具,并且知道如何生成你想要的原始字符串。 filePath=$(jq -r '.file_path' ../package.json).
  • 最后一个 grep grep -o '[^"]*'。如果不需要,请不要包含引号

标签: bash git shell


【解决方案1】:

这行得通:

$ printf '{"file-path": "/some/path"}' | jq --raw-output '."file-path"'
/some/path

所以在你的情况下:

filePath=$(jq --raw-output '."file-path"' ../package.json)

您必须引用密钥,因为它包含连字符。

【讨论】:

    【解决方案2】:

    我最近遇到了一个问题,即 bash 只删除不是由变量扩展产生的引号。因此,要让 bash 删除字符串中的双引号,请使用 eval 在变量扩展后处理字符串:

    foo=\"abc\"\ \"def\"
    echo $foo
    "abc" "def"
    eval echo $foo
    abc def
    

    当然,不要对来自用户的未经处理的字符串使用 eval,因为它很容易受到 ';'、'&&' 等的影响来执行任意 bash。

    【讨论】:

      【解决方案3】:

      以下将起作用:

      filePath=$(grep -o '"file-path": *"[^"]*"' ./package.json | cut -d: -f2 | tr -d ' "')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多