【问题标题】:Adding double quotes to beginning, end and around comma's in bash variable在 bash 变量的开头、结尾和逗号周围添加双引号
【发布时间】:2016-10-06 23:32:11
【问题描述】:

我有一个接受逗号分隔参数的 shell 脚本,

-s 1234,1244,1567

传递给 curl PUT json 字段。 Json 需要 "1234","1244","1567" 格式的值。

目前,我正在传递带有引号的参数: -s "\"1234\",\"1244\",\"1567\"",这行得通,但用户抱怨它打字太多而且很难做到。所以我想像我在顶部一样采用逗号分隔的列表,并以编程方式将引号插入。

基本上,我希望将参数作为 1234,2345 传入并最终作为变量 "1234","2345"

我已经读到这里最简单的方法是使用 sed,但我真的不熟悉它,我所有的努力都失败了。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    您可以在 BASH 中执行此操作:

    $> arg='1234,1244,1567'
    
    $> echo "\"${arg//,/\",\"}\""
    "1234","1244","1567"
    

    【讨论】:

      【解决方案2】:

      awk 来救援!

      $ awk -F, -v OFS='","' -v q='"' '{$1=$1; print q $0 q}' <<< "1234,1244,1567"
      
      "1234","1244","1567"
      

      sed 或更短

      $ sed -r 's/[^,]+/"&"/g' <<< "1234,1244,1567"
      
      "1234","1244","1567"
      

      将其翻译回awk

      $ awk '{print gensub(/([^,]+)/,"\"\\1\"","g")}' <<< "1234,1244,1567"
      
      "1234","1244","1567"
      

      【讨论】:

      • 巧妙使用 awk 的 line-rewrite。 :)
      【解决方案3】:

      你可以用这个:

      echo QV=$(echo 1234,2345,56788 | sed -e 's/^/"/' -e 's/$/"/' -e 's/,/","/g')
      

      结果:

      echo $QV
      "1234","2345","56788"
      

      只需在开始、结束时添加双引号,并将逗号替换为全局引号/逗号/引号。

      【讨论】:

        【解决方案4】:

        sed很容易做到

        $ echo '1234,1244,1567' | sed 's/[0-9]*/"\0"/g'
        "1234","1244","1567"
        
        • [0-9]* 零个连续数字,因为 * 很贪心,它会尝试匹配尽可能多的数字
        • "\0" 双引号匹配的模式,整个匹配默认保存在\0
        • g 全局标志,替换所有此类模式

        如果在某些sed 版本中无法识别\0,请改用&amp;

        $ echo '1234,1244,1567' | sed 's/[0-9]*/"&"/g'
        "1234","1244","1567"
        


        perl类似的解决方案

        $ echo '1234,1244,1567' | perl -pe 's/\d+/"$&"/g'
        "1234","1244","1567"
        


        注意:使用* 而不是+perl 会给出

        $ echo '1234,1244,1567' | perl -pe 's/\d*/"$&"/g'
        "1234""","1244""","1567"""
        ""$ 
        

        我认为sedperl 之间的这种区别类似于这个问题:GNU sed, ^ and $ with | when first/last character matches

        【讨论】:

        • \0 对我不起作用,导致每个值都是0。你确定你不是指&amp;
        • 我在最近的 OS X、FreeBSD 10.3 和一个其 sed --version 报告 This is not GNU sed 4.0 的 Busybox 安装中进行了尝试。还在工作的 GNU sed 4.2.1 上进行了测试。在我看来 \0 可能是 GNU 特有的,我想我会选择 sed -r 's/[0-9]+/"&amp;"/g'
        • 感谢您的更新!太好了,您牢记便携性。我发现busybox的sed支持-r但不支持-E,这就是我建议的原因。由于 FreeBSD 为兼容性添加了-r,所以我不再有任何不支持-r 的系统。
        【解决方案5】:

        使用sed

        $ echo 1234,1244,1567 | sed 's/\([0-9]\+\)/\"\1\"/g'
        "1234","1244","1567"
        

        即。将所有数字字符串替换为使用反向引用 (\1) 引用的相同数字字符串。

        【讨论】:

          猜你喜欢
          • 2019-04-25
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          相关资源
          最近更新 更多