首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析和扩展区间

解析和扩展区间
EN

Stack Overflow用户
提问于 2013-03-10 01:41:29
回答 8查看 1.2K关注 0票数 2

在我的脚本中,我需要扩展一个间隔,例如:

代码语言:javascript
复制
input: 1,5-7

获取类似以下内容的内容:

代码语言:javascript
复制
output: 1,5,6,7

我在这里找到了其他解决方案,但它们涉及到python,我不能在我的脚本中使用它。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-10 02:08:14

仅使用Bash 4内建的解决方案

您可以使用Bash range expansions。例如,假设您已经解析了输入,您可以执行一系列连续的操作来将范围转换为逗号分隔的序列。例如:

代码语言:javascript
复制
value1=1
value2='5-7'
value2=${value2/-/..}
value2=`eval echo {$value2}`
echo "input: $value1,${value2// /,}"

关于eval危险的所有常见警告都适用,您最好用Perl、Ruby、Python或AWK来解决这个问题。如果您不能或不愿意,那么您至少应该考虑在您的转换中包含一些管道工具,如tr或sed,以避免对eval的需要。

票数 2
EN

Stack Overflow用户

发布于 2013-03-10 02:12:57

尝试如下所示:

代码语言:javascript
复制
#!/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,追加可能比一遍又一遍地重新创建数组更可取。

票数 2
EN

Stack Overflow用户

发布于 2013-03-10 02:24:46

这应该也适用于多个范围。

代码语言:javascript
复制
#! /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}

将产生以下输出:

代码语言:javascript
复制
1,5,6,7,13,14,15,16,17,18,22
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15313848

复制
相关文章

相似问题

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