首页 > 解决方案 > 用 Bash 中数组中的值替换文本

问题描述

我正在尝试用“sed”数组中的值替换单词。问题是数组对于每个文件都有不同的长度,0、1 或 9 个值。替换时,值应以逗号分隔。例如:

array = (one two three)
sed -e "s | value = \" text to replace \ "| value = \" $ {array (*)} \ "| g"
the result should look like this: value = one, two, three
and if array = (one) => value = one

有人能帮助我吗?先感谢您!

标签: arraysbashsed

解决方案


bash 变量赋值不能有空格=

array=(one two three)

要使用单个角色加入,IFS 是您的朋友:

IFS=,

# .....v.......................................v.............v...v
sed -e 's/value = " text to replace "/value = "'"${array[*]}"'"/g'
# ..............................................^^^^^^^^^^^^^

我的引述是非常刻意的。我已经标记了单引号开始和停止的位置,并且数组扩展必须用双引号引起来。

总的来说,你很接近。必须小心空格,bash 可能对它非常敏感。


IFS是 shell 的“内部字段分隔符”——它用于

  • 将字符串拆分为字段

    line="foo,bar:baz"
    IFS=':,'
    read first second third <<<"$line"
    declare -p first second third
    
  • 数组元素连接成单个字符串

    set -- a b c d
    IFS=':,'
    echo "$*"     # _must_ be quoted
    

推荐阅读