在我的脚本中,我需要扩展一个间隔,例如:
input: 1,5-7获取类似以下内容的内容:
output: 1,5,6,7我在这里找到了其他解决方案,但它们涉及到python,我不能在我的脚本中使用它。
发布于 2013-03-10 02:08:14
仅使用Bash 4内建的解决方案
您可以使用Bash range expansions。例如,假设您已经解析了输入,您可以执行一系列连续的操作来将范围转换为逗号分隔的序列。例如:
value1=1
value2='5-7'
value2=${value2/-/..}
value2=`eval echo {$value2}`
echo "input: $value1,${value2// /,}"关于eval危险的所有常见警告都适用,您最好用Perl、Ruby、Python或AWK来解决这个问题。如果您不能或不愿意,那么您至少应该考虑在您的转换中包含一些管道工具,如tr或sed,以避免对eval的需要。
发布于 2013-03-10 02:12:57
尝试如下所示:
#!/bin/bash
for f in ${1//,/ }; do
if [[ $f =~ - ]]; then
a+=( $(seq ${f%-*} 1 ${f#*-}) )
else
a+=( $f )
fi
done
a=${a[*]}
a=${a// /,}
echo $a编辑:正如注释中提到的@Maxim_united,追加可能比一遍又一遍地重新创建数组更可取。
发布于 2013-03-10 02:24:46
这应该也适用于多个范围。
#! /bin/bash
input="1,5-7,13-18,22"
result_str=""
for num in $(tr ',' ' ' <<< "$input"); do
if [[ "$num" == *-* ]]; then
res=$(seq -s ',' $(sed -n 's#\([0-9]\+\)-\([0-9]\+\).*#\1 \2#p' <<< "$num"))
else
res="$num"
fi
result_str="$result_str,$res"
done
echo ${result_str:1}将产生以下输出:
1,5,6,7,13,14,15,16,17,18,22https://stackoverflow.com/questions/15313848
复制相似问题