$ landscape=aws,azure
$ echo $landscape
预期o / p:
aws-landscape,azure-landscape
我现在怎么做..!?
$ landscape=aws,azure
$ GITLANDSCAPE=$(echo $Landscapes | sed 's/,/-landscape,/g' | sed 's/$/-landscape/g')
$ echo $GITLANDSCAPE
有更好的方法吗?
答案 0 :(得分:4)
替换逗号不是特别好的风格。
你可以这样做:
landscape=aws,azure
echo $landscape | awk 'BEGIN{FS=",";OFS=",";suffix="-landscape"}{print $1suffix,$2suffix}'
输出:
aws-landscape,azure-landscape
在BEGIN
块中设置以下变量:
答案 1 :(得分:2)
使用sed,你可以这样做:
echo $landscape | sed -E 's/,|$/-landscape&/g'
aws-landscape,azure-landscape
或者,您可以使用awk:
echo $landscape | awk -F, '{print $1"-landscape,"$2"-landscape"}'
aws-landscape,azure-landscape
答案 2 :(得分:2)
使用逗号分隔字符串可能是主要的痛点。外壳自然支持空格分隔的标记。
printf '%s-landscape\n' aws azure
如果你想做一些更复杂的事情,可能是一个循环。
sep=''
for token in aws azure; do
printf '%s%s-landscape' "$sep" "$token"
sep=','
done
如果你想做一些更复杂的事情,也许把它们放在一个数组中。 (这不是Bourne / POSIX sh
兼容,而是Ksh,Bash等中的常见扩展。)
a=(aws azure)
for token in "${a[@]}"; do ...
另外,在Bash中,还有支撑扩展:
printf '%s\n' {aws,azure}-landscape
这是折磨,但产生了你的要求:
printf '%s' {aws,\,azure}-landscape
第一个逗号分隔大括号之间的短语。要在其中一个短语中包含文字逗号,我们会反斜杠。
答案 3 :(得分:0)
如果我理解你,你有一个变量,其中包含以逗号分隔的单词列表。您希望为每个单词添加固定字符串-landscape
,并将逗号保留为分隔符。
这是一种方法,只要没有任何单词包含空格:
words1=ab,cd,ef,gh
words2=$(printf %s $words1 | xargs --delimiter , -L 1 printf "%s-landscape " | fmt -1 | paste -d, -s)
echo $words2
这会打印
ab-landscape,cd-landscape,ef-landscape,gh-landscape
工作原理: xargs 将 words1 字符串拆分为单个字,并调用 printf 添加 -landscape 每个人。结果输出仍然用空格分隔,而不是用逗号分隔。使用 fmt ,这些单词放在单独的行中,每个单词一行。最后的粘贴用逗号连接这些行。