如何解决如何使用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
,
您可能应该使用两个嵌套循环:
- 遍历数组的所有元素
- 遍历元素中的所有字符,检查字符是否为数字
(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 举报,一经查实,本站将立刻删除。