【问题标题】:How to add double quotes around the values separated by a delimiter?如何在由分隔符分隔的值周围添加双引号?
【发布时间】:2019-12-31 12:38:02
【问题描述】:

我采用一个字符串,其值由, 分隔。我需要在“周围”加上双引号,并在每次拆分后进行修剪。

这是我的实际代码:

input="TAG1, TAG2"
output='[ "'${input//, /\", \"}'" ]'
echo "$output"

正确显示:

[ "TAG1", "TAG2" ]

但是:

  1. 如果我使用input="TAG1,TAG2"(即, 后面没有空格),它不起作用
  2. 如果我使用input=" TAG1, TAG2 ",它会保留空格并且不会修剪每个匹配项。对于每个项目都应该如此。

你会怎么做?

【问题讨论】:

    标签: bash shell awk split jq


    【解决方案1】:

    这是jq 解决方案:

    jq -cR '. | gsub("^ +| +$"; "") | split(" *, *"; "")' <<< "TAG1,TAG2"
    ["TAG1","TAG2"]
    
    jq -cR '. | gsub("^ +| +$"; "") | split(" *, *"; "")' <<< "TAG1, TAG2"
    ["TAG1","TAG2"]
    
    jq -cR '. | gsub("^ +| +$"; "") | split(" *, *"; "")' <<< "   TAG1,       TAG2     "
    ["TAG1","TAG2"]
    

    PS:如果你想要漂亮的json 输出,请删除-c


    你也可以使用awk:

    cat comma.csv
    

    BEGIN {
       FS = " *, *"
       OFS=", "
    }
    {
       for (i=1; i<=NF; i++) {
          gsub(/^ *| *$/, "", $i)
          $i = "\"" $i "\""
       }
    
       print "[ " $0 " ]"
    }
    

    并将其用作:

    awk -f comma.csv <<< "TAG1, TAG2"
    [ "TAG1", "TAG2" ]
    
    awk -f comma.csv <<< "TAG1,TAG2"
    [ "TAG1", "TAG2" ]
    
    awk -f comma.csv <<< "   TAG1,   TAG2   "
    [ "TAG1", "TAG2" ]
    

    sed解决方案:

    sed 's/^ */[ "/; s/ *$/" ]/; s/ *, */", "/g' <<< "       TAG1,        TAG2     "
    [ "TAG1", "TAG2" ]    
    
    sed 's/^ */[ "/; s/ *$/" ]/; s/ *, */", "/g' <<< "TAG1,TAG2"
    [ "TAG1", "TAG2" ]
    
    sed 's/^ */[ "/; s/ *$/" ]/; s/ *, */", "/g' <<< "TAG1 , TAG2"
    [ "TAG1", "TAG2" ]
    

    【讨论】:

    • awk 默认存在于每个 unix、Linux、OSX 系统上
    • 这写在一个文件上。如示例所示,我需要写入 var。你能发布代码吗?
    • 不,这不会写入文件。要将输出存储在变量中,请使用:var=$(awk -f comma.csv &lt;&lt;&lt; " TAG1, TAG2 ")
    • 我还添加了jqsed 解决方案。
    【解决方案2】:

    我不明白“修剪”是什么意思,我认为空格可以安全地忽略。

    首先让我们将输入读入一个数组。读取以空格或逗号分隔的项目。

    input="        TAG1        ,      TAG2        "
    IFS=', ' read -r -a input <<<"$input"
    

    然后创建output:首先在单独的换行符上输出带有"的数组元素,然后用逗号连接它们,添加前导[和尾随]

    output="[ $(printf '"%s"\n' "${input[@]}" | paste -sd,) ]"
    echo "$output"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      相关资源
      最近更新 更多