我有来自用户的字符串,其形式为...... 1,2,3
,包含任意数量的数字。我想要做的是将数字替换为数组中每个数字的indeces处的相应值。所以说我的阵列有[tom] [jerry] [sue]。当我正在处理时,我希望我的字符串看起来像汤姆,杰瑞,起诉。我应该使用grep吗?的bash?
答案 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"
说明:
sed
以空格替换逗号从字符串生成的数字数组。还有其他方法可以做到这一点,但我倾向于使用sed
。例如,indexes=( ${string//,/ }
将在不调用sed
或任何外部程序的情况下完成工作。result
。pad
使用分隔符构建字符串。indexes
$i
中的数字所代表的名称的串联。我没有计算'do'或'done'行。
我应该更具体一点,并问你
sed
语法是如何工作的。
该行有4个有趣的部分:
indexes=( $(sed 's/,/ /g' <<< "$string") )
indexes=( ... )
这是一个数组赋值。它将使用...
中的任何内容生成单词,并将它们视为数组的元素。当然,这就是names=( ... )
作业的工作方式。
sed ... <<< "$string"
这将运行sed
命令,其值为"$string"
作为其标准输入。这是一个名为Here String的bash
扩展程序。因此,唯一的输入线是“1,2,3”。
's/,/ /g'
是一个sed
命令,用于为输入中的每个逗号替换空格。因此,输出是包含1 2 3
。
$( ... )
运行括号内的命令(sed
命令),并将输出视为字符串。
整体效果与:
相同indexes=( 1 2 3 )
括号周围的空格并不是绝对必要的,但我认为它们使得数组赋值更容易被发现 - 但它是一种我仍在“学习”的符号(必须记住使用)。