我正在编写一个bash脚本,它需要一个数字,还有一个以逗号分隔的值和字符串序列,例如:3,15,4-7,19-20。我想检查数字是否包含在与序列相对应的集合中。为了简单起见,假设没有逗号分隔的元素相交,并且元素按升序排序。
除了蛮力天真的方式之外,还有其他简单的方法来做到这一点吗?一些shell实用程序为我做了类似的事情,也许是一些与lpr相关的工具,它已经知道如何处理页面范围序列等等。
发布于 2022-02-10 14:50:19
胡克作弊吗?:
$ 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)' -输出:
4-7另一个版本:
$ 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]
}
}' -产出:
19-20后者更好,因为您可以从文件中提供更多的值等等。然后,前者更短。:D
发布于 2022-02-10 15:07:57
纯巴什:
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发布于 2022-02-10 16:43:21
当bash被标记时,为什么不只是
inrange() { for r in ${2//,/ }; do ((${r%-*}<=$1 && $1<=${r#*-})) && break; done; }然后像往常一样测试它:
$ 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
nohttps://stackoverflow.com/questions/71066801
复制相似问题