微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用bash中的if语句仅捕获数组中的数字

如何解决如何使用bash中的if语句仅捕获数组中的数字

len=${#newarray[*]}

for ((i=0;i<${len};i++)); do

    if [[ "${newarray[$i]}" =~ ^[[:digit:]]+$ ]]; then 

        echo "${newarray[$i]}"     
    fi
  

这是我的代码,我只需要从数组列表中获取数字及其计数。但是存在一个显示字母值的问题。

鉴于getdata.txt包含-

   cat  
   dog
   1234
   pl345
   567ab
   12234
     

解决方法

具有:

value=(cat dog 1234 pl345 567ab 12234)

您可以打印“仅数字”:

$ printf "%s\n" "${value[@]}" | grep -o "[0-9]*"
1234
345
567
12234

或者您可能想要“仅包含数字的行”:

$ printf "%s\n" "${value[@]}" | grep -x "[0-9]*"
1234
12234

或者您可能想要“仅包含数字的行”:

$ printf "%s\n" "${value[@]}" | grep "[0-9]"
1234
pl345
567ab
12234
,

您的if/else向后。

value=(cat dog 1234 pl345 567ab 12234)
len=${#value[*]}
    
for ((i=0;i<${len};i++)); do
    if [[ "${value[$i]}" =~ ^[[:digit:]]+$ ]]; then 
         echo "${value[$i]}"   
    fi
done

这将输出:

1234
12234
,

bash中有一种使用shopt的非正则表达式方式:

# enable extended glob
shopt -s extglob

value=(cat dog 1234 pl345 567ab 12234)

# lop through array and print only it contains 1+ digits
for v in "${value[@]}"; do [[ $v == +([0-9]) ]] && echo "$v"; done
1234
12234
,

您可能应该使用两个嵌套循环:

  1. 遍历数组的所有元素
  2. 遍历元素中的所有字符,检查字符是否为数字

(2)使用grep可能会更简单,但是由于我们谈论的是bash实现,因此我想到了:

#!/bin/bash

a=(cat dog 1234 pl345 567ab 12234) # input array

for s in "${a[@]}"; do # iterate over all elements of our array
        res=''
        for ((i=0;i<${#s};i++)); do # iterate over all chars of element $s
                c="${s:$i:1}" # $c is now char at $i position inside $s
                case "$c" in
                        [0-9]) res="${res}${c}" # append digit to res
                esac
        done
        [ -n "$res" ] && echo "$res" # if $s contains at least 1 digit,print it
                                     # you may add $res to another array here if needed

done
,

简单

tr -dc '0-9\n' <getdata.txt
,

您可以使用:

$ cat getdata.txt |grep -P '^[0-9]+$'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。