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

Tyl*_*aff 0 bash shell grep

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

Jon*_*ler 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"
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 模拟用户的输入字符串
  2. 名称数组,索引从0(nobody)到3(sue)
  3. 通过请求sed用空格替换逗号从字符串生成的数字数组.还有其他方法可以做到这一点,但我倾向于使用sed静止.例如,indexes=( ${string//,/ }无需调用sed或任何外部程序即可完成工作.
  4. 输出进入result.
  5. pad用来建立带分隔符的字符串.
  6. 循环遍历数组中的数字 indexes
  7. 结果是前面的内容,填充和数字所代表的名称的串联$i.
  8. 将填充设置为逗号以进行第二次和后续迭代.
  9. 回应结果.

我没有计算'做'或'做'线.


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

该行有4个有趣的部分:

indexes=( $(sed 's/,/ /g' <<< "$string") )
Run Code Online (Sandbox Code Playgroud)
  1. indexes=( ... )

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

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

    这将运行sed命令,其值为"$string"标准输入.这是一个bash名为Here String的扩展.因此,唯一的输入线是"1,2,3".

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

  4. $( ... )运行括号(sed命令)中包含的命令,并将输出视为字符串.

整体效果如下:

indexes=( 1 2 3 )
Run Code Online (Sandbox Code Playgroud)

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

  • 这里不需要`sed`:`indices =($(sed's /,//g'<<<"$ string"))`可以替换为`IFS =,read -a indices <<<"$字符串"`. (2认同)