将包含数字范围的字符串转换为数字本身的最佳方法是什么?例如,此格式用于定义要打印的页面范围。我定义,我想打印这些页面“11-14,17,20”。现在我需要编写 bash 脚本,将此字符串更改为数字数组:11, 12, 13, 14, 17, 20
它应该能够处理包含数字(甚至更多位数)以及“,”和“-”的字符串。
答案1
在 Perl 中这样做:
echo 11-14,17,20 | perl -pe 's/(\d+)-(\d+)/join(",",$1..$2)/eg'
输出:
11,12,13,14,17,20
答案2
这是一个使用的解决方案awk
:
#!/bin/bash
pages="11-14,17,20"
echo $pages | awk 'BEGIN { RS=","; FS="-"; ORS="" }
NR > 1 { print "," }
NF > 1 { for (i=$1; i<$2; ++i) { print i "," } print $2; next }
{ print $1 }'
输出结果如下:
11,12,13,14,17,20
答案3
只需 bash:
expand_ranges() {
local IFS=,
set -- $1
for range; do
case $range in
*-*) for (( i=${range%-*}; i<=${range#*-}; i++ )); do echo $i; done ;;
*) echo $range ;;
esac
done
}
numbers=( $(expand_ranges 11-14,17,20) )
对于您请求的输出: IFS=,; echo ${numbers[*]}
答案4
这是一种类似 Lisp 的做事方式(除了 bash 不喜欢惰性列表,所以我们必须设置最大页码的上限;这里我选择了 10000)
pages="11-14,17,20"; for ((i=1;i<10000;i++)); do echo -n $i, ; done | cut -d , -f $pages
使用 pages,您可以像在其他帖子中一样指定页面范围。for 循环生成页码列表。cut 命令会从中挑选出您想要的页码。