在bash变量

时间:2016-10-05 17:28:15

标签: bash sed

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

-s 1234,1244,1567

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

目前,我正在传递参数,其中已有引号: -s "\"1234\",\"1244\",\"1567\"",这是有效的,但用户抱怨它打字太多而且难以做到。因此,我只想采用逗号分隔列表,就像我在顶部并以编程方式粘贴引号一样。

基本上,我希望将参数作为1234,2345传递,最后作为"1234","2345"的变量

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

5 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

你可以用这个:

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

结果:

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

只需在开头,结尾添加双引号,并用引号/逗号/引号全局替换逗号。

答案 2 :(得分:1)

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

git push origin branch-b --force

答案 3 :(得分:1)

很容易使用sed

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

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

$ 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

答案 4 :(得分:0)

使用sed

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

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