在Unix中格式化字符串

时间:2018-01-23 06:21:27

标签: shell unix awk sed

$ 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

有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

替换逗号不是特别好的风格。

你可以这样做:

landscape=aws,azure
echo $landscape | awk 'BEGIN{FS=",";OFS=",";suffix="-landscape"}{print $1suffix,$2suffix}'

输出:

aws-landscape,azure-landscape

BEGIN块中设置以下变量:

  • FS:字段分隔符
  • OFS:输出字段分隔符
  • 后缀:您可以在此处使用变量,以防您以后想要更改文字而不想更改代码中多个地方的文字

答案 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 ,这些单词放在单独的行中,每个单词一行。最后的粘贴用逗号连接这些行。