如何使用bash替换字符串的一部分?

时间:2014-03-21 23:01:25

标签: bash shell grep

我有来自用户的字符串,其形式为...... 1,2,3,包含任意数量的数字。我想要做的是将数字替换为数组中每个数字的indeces处的相应值。所以说我的阵列有[tom] [jerry] [sue]。当我正在处理时,我希望我的字符串看起来像汤姆,杰瑞,起诉。我应该使用grep吗?的bash?

1 个答案:

答案 0 :(得分:5)

string="1,2,3"
names=( nobody tom jerry sue )
indexes=( $(sed 's/,/ /g' <<< "$string") )
result=""
pad=""
for i in ${indexes[@]}
do
    result="$result$pad${names[$i]}"
    pad=","
done
echo "$result"

说明:

  1. 模拟用户的输入字符串
  2. 名称数组,索引范围为0(nobody)至3(sue)
  3. 通过请求sed以空格替换逗号从字符串生成的数字数组。还有其他方法可以做到这一点,但我倾向于使用sed。例如,indexes=( ${string//,/ }将在不调用sed或任何外部程序的情况下完成工作。
  4. 输出结果为result
  5. 我使用pad使用分隔符构建字符串。
  6. 遍历数组indexes
  7. 中的数字
  8. 结果是之前的内容,填充以及$i中的数字所代表的名称的串联。
  9. 将pad设置为逗号以进行第二次和后续迭代。
  10. 回应结果。
  11. 我没有计算'do'或'done'行。


      

    我应该更具体一点,并问你sed语法是如何工作的。

    该行有4个有趣的部分:

    indexes=( $(sed 's/,/ /g' <<< "$string") )
    
    1. indexes=( ... )

      这是一个数组赋值。它将使用...中的任何内容生成单词,并将它们视为数组的元素。当然,这就是names=( ... )作业的工作方式。

    2. sed ... <<< "$string"

      这将运行sed命令,其值为"$string"作为其标准输入。这是一个名为Here Stringbash扩展程序。因此,唯一的输入线是“1,2,3”。

    3. 's/,/ /g'是一个sed命令,用于为输入中的每个逗号替换空格。因此,输出是包含1 2 3

    4. 的行
    5. $( ... )运行括号内的命令(sed命令),并将输出视为字符串。

    6. 整体效果与:

      相同
      indexes=( 1 2 3 )
      

      括号周围的空格并不是绝对必要的,但我认为它们使得数组赋值更容易被发现 - 但它是一种我仍在“学习”的符号(必须记住使用)。