首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash中生成用例范围

在bash中生成用例范围
EN

Stack Overflow用户
提问于 2016-06-26 08:49:11
回答 3查看 213关注 0票数 4

我想在一个函数中输入两个和三个数字,并输出一个大小写范围,即输入3366,输出3[3-9] | [4-5][0-9] | 6[0-6]或输入33666以及输出3[3-9] | [4-9][0-9] | [1-5][0-9][0-9] | 6[0-5][0-9] | 66[0-6]

关于如何做到这一点,有什么想法?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-10 09:27:55

只想共享最终代码:https://gist.github.com/zaydek/1627329f88c444f6d71d5cbc0cda616f :)

代码语言:javascript
运行
复制
function enc {

    a=${1: -3:1}; b=${1: -2:1}; c=${1: -1}
    d=${2: -3:1}; e=${2: -2:1}; f=${2: -1}

    if   (( $[a] < $[d] )); then

        if   (( $b$c == 00 && $e$f == 99 )); then echo [$a-$d][0-9][0-9]
        elif (( $b$c == 00 )); then if (( $[a+1] < $d )); then echo [$a-$[d-1]][0-9][0-9] "|"; echo $(enc $[d]00 $d$e$f)
                                                          else echo $a[0-9][0-9] "|"; echo $(enc $[a+1]00 $d$e$f); fi

        else echo $(enc $a$b$c $[a]99) "|"; echo $(enc $[a+1]00 $d$e$f); fi

    elif (( $b < $e )); then

        if   (( $c == 0 && $f == 9 )); then echo $a[$b-$e][0-9]
        elif (( $c == 0 )); then if (( $[b+1] < $e )); then echo $a[$b-$[e-1]][0-9] "|"; echo $(enc $a$[e]0 $d$e$f)
                                                       else echo $a$b[0-9] "|"; echo $(enc $a$[e]0 $d$e$f); fi

        else echo $(enc $a$b$c $a$[b]9) "|"; echo $(enc $a$[b+1]0 $d$e$f); fi

    else

        if (( $c == $f )); then echo $a$b$c
        else echo $a$b[$c-$f]; fi; fi

}

function int {

    if [[ $1 = *.* ]]; then

        integer=${1%.*}
        decimal=${1#*.}

        if (( ${decimal:0:1} >= 5 )); then integer=$[integer+1]; fi

         echo $integer
    else echo $1; fi

}

function cse {

    minimum=$(int $(echo $1 $2 | awk '{ print ($1/$2)*( 90) }'))
    maximum=$(int $(echo $1 $2 | awk '{ print ($1/$2)*(110) }'))

    echo $(enc $minimum $maximum)

}

cse $1 $2

cse接受两个输入,将它们转换为小数,并将每个输入从一个范围(即90110 )转换为-10%和+10%的误差范围,然后将minimummaximum输出作为输入传递给enc,这是一个生成case范围语法的递归函数(通过语法优化)。

请注意,bash似乎没有按预期或预期处理大小写范围的表达式。不过,此代码可用于为所有2至3位数字生成大小写范围,然后复制并粘贴为内联代码。

票数 1
EN

Stack Overflow用户

发布于 2016-06-27 17:18:29

这是0-99的最大2位大小写,我没有使用字符的运算,实际上我试过数学算术。

以下是一些产出:

./range.sh 1 39 -> 0[1-9] | [1-2][0-9] | 3[0-9]

./range.sh 21 49 -> 2[1-9] | [3-4][0-9]

./range.sh 33 66 -> 3[3-9] | [4-5][0-9] | 6[0-6]

./range.sh 33 99 -> 3[3-9] | [4-8][0-9] | 9[0-9]

这是我的代码: range.sh,希望它能为您提供一些帮助:

代码语言:javascript
运行
复制
#!/bin/bash

LHS=$1
RHS=$2
B2=10

D2=$(echo "($RHS-$LHS)/$B2" | bc)
if [[ ${D2} -gt 0 ]]; then
  S2=(`seq $(echo "$LHS/$B2" | bc) $(echo "$LHS/$B2+$D2" | bc)`)
  #echo ${S2[@]}
  C=${#S2[@]}
  #echo $C

  L1=$(echo "$LHS%$B2" | bc)
  if [[ ${L1} -lt 9 ]]; then 
    L1R="[${L1}-9]"
  else
    L1R="9"
  fi

  R1=$(echo "$RHS%$B2" | bc)
  if [[ ${R1} -gt 0 ]]; then
    R1R="[0-${R1}]"
  else
    R1R="[0-9]"
  fi

  if [[ ${C} -gt 3 ]]; then
    echo -n $(echo "$LHS/$B2" | bc)$L1R
    echo -n " | "[${S2[1]}-${S2[$C-2]}][0-9]
    echo -n " | "${S2[$C-1]}$R1R
  elif [[ ${C} -eq 3 ]]; then
    if [[ ${S2[0]} -eq 0 ]]; then
      echo -n 0$L1R
    else
      echo -n $(echo "$LHS/$B2" | bc)$L1R
    fi
    echo -n " | "[${S2[1]}-${S2[$C-1]}][0-9]
  fi

else
  echo [$LHS-$RHS]
fi

echo
票数 0
EN

Stack Overflow用户

发布于 2016-06-28 03:05:14

以下是2位数字的逻辑:

代码语言:javascript
运行
复制
#!/bin/bash
l=$1
h=$2

function get_nearest_upper_10th_mutlitple()
{
    v=$(($1+10))
    echo "${v%?}0"
}
function get_nearest_lower_10th_mutlitple()
{
    v=$1
    echo "${v%?}0"
}

temp="$(printf '%d' $l | wc -m)$(printf '%d' $h | wc -m)"
case $temp in
    11) echo "[$l-$h]"      ;;
    22|12)
        a=$([[ $(($l%10)) -eq 0 ]] && echo $l || echo $(($(get_nearest_upper_10th_mutlitple $l)-1)))
        if [[ $(printf '%d' $a | wc -m) -eq 1 ]]; then
            echo [$l-$a]
        else
            [[ $a -gt $l ]] && echo "${l%?}[${l#?}-${a#?}]" || echo $a
        fi

        b=$([[ $(($h%10)) -eq 0 ]] && echo $h || get_nearest_lower_10th_mutlitple $h)

        x=$((a+1))
        y=$((b-1))
        echo "[$(echo ${x%?}~${y%?} | sed 's/~/\n/g' | sort -n | uniq | paste -s -d '-')][${x#?}-${y#?}]"

        [[ $b -lt $h ]] && echo "${h%?}[${b#?}-${h#?}]" || echo $b
esac

以下是样本输出:

代码语言:javascript
运行
复制
$ ./script.bash 2 8
[2-8]
$ ./script.bash 2 6
[2-6]
$ ./script.bash 2 68
[2-9]
[1-5][0-9]
6[0-8]
$ ./script.bash 23 68
2[3-9]
[3-5][0-9]
6[0-8]
$ ./script.bash 23 99
2[3-9]
[3-8][0-9]
9[0-9]
$ ./script.bash 23 80
2[3-9]
[3-7][0-9]
80
$ ./script.bash 40 80
40
[4-7][1-9]
80
$ ./script.bash 40 80 | paste -s -d '|'
40|[4-7][1-9]|80
$ ./script.bash 35 55
3[5-9]
[4][0-9]
5[0-5]

您可以使用paste -s -d '|'将各个范围组合成单个ORed范围。

您可以使用我所做的现有函数将其扩展为3位数字(在一段时间后,我也会发布3位数字版本,对于1312有不同的情况)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38036775

复制
相关文章

相似问题

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