在 Bash 中将字符串“1-5”转换为数字数组

在 Bash 中将字符串“1-5”转换为数字数组

将包含数字范围的字符串转换为数字本身的最佳方法是什么?例如,此格式用于定义要打印的页面范围。我定义,我想打印这些页面“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 命令会从中挑选出您想要的页码。

相关内容