首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数字与逗号分隔的范围序列相匹配。

将数字与逗号分隔的范围序列相匹配。
EN

Stack Overflow用户
提问于 2022-02-10 14:22:14
回答 4查看 79关注 0票数 0

我正在编写一个bash脚本,它需要一个数字,还有一个以逗号分隔的值和字符串序列,例如:3,15,4-7,19-20。我想检查数字是否包含在与序列相对应的集合中。为了简单起见,假设没有逗号分隔的元素相交,并且元素按升序排序。

除了蛮力天真的方式之外,还有其他简单的方法来做到这一点吗?一些shell实用程序为我做了类似的事情,也许是一些与lpr相关的工具,它已经知道如何处理页面范围序列等等。

EN

回答 4

Stack Overflow用户

发布于 2022-02-10 14:50:19

胡克作弊吗?:

代码语言:javascript
运行
复制
$ echo -n 3,15,4-7,19-20 | 
  awk -v val=6 -v RS=, -F- '(NF==1&&$1==val) || (NF==2&&$1<=val&&$2>=val)' -

输出:

代码语言:javascript
运行
复制
4-7

另一个版本:

代码语言:javascript
运行
复制
$ echo 19 |
awk -v ranges=3,15,4-7,19-20 '
BEGIN {
    split(ranges,a,/,/)
}
{
    for(i in a) {
        n=split(a[i],b,/-/)
        if((n==1 && $1==a[i]) || (n==2 && $1>=b[1] && $1<=b[2]))
            print a[i]
    }
}' -

产出:

代码语言:javascript
运行
复制
19-20

后者更好,因为您可以从文件中提供更多的值等等。然后,前者更短。:D

票数 2
EN

Stack Overflow用户

发布于 2022-02-10 15:07:57

纯巴什:

代码语言:javascript
运行
复制
check() {
  IFS=, a=($2)
  for b in "${a[@]}"; do
    IFS=- c=($b); c+=(${c[0]})
    (( $1 >= c[0] && $1 <= c[1] )) && break
  done
}

$ check 6 '3,15,4-7,19-20' && echo "yes" || echo "no"
yes
$ check 42 '3,15,4-7,19-20' && echo "yes" || echo "no"
no
票数 2
EN

Stack Overflow用户

发布于 2022-02-10 16:43:21

bash被标记时,为什么不只是

代码语言:javascript
运行
复制
inrange() { for r in ${2//,/ }; do ((${r%-*}<=$1 && $1<=${r#*-})) && break; done; }

然后像往常一样测试它:

代码语言:javascript
运行
复制
$ inrange 6 3,15,4-7,19-20 && echo yes || echo no
yes
$ inrange 42 3,15,4-7,19-20 && echo yes || echo no
no
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71066801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档