我有一个包含多个元素的 bash 数组,其中只有一个元素采用 nn.wr 格式,其中 nn 是一个可变整数。
例如
array=( "abcd" "01.wr" "ef_gh" )
但是它可以位于数组中的任何位置。我怎样才能找到它并归还它?我试图使用部分匹配 *.wr 但无法完全让 sed 或 awk 来做到这一点。
一定有办法的!!
答案1
不需要像sed
或 之类的外部命令awk
。循环元素并使用模式匹配:
#! /bin/bash
array=( "abcd" "01.wr" "ef_gh" )
unset found
for e in "${array[@]}" ; do
if [[ $e == +([0-9]).wr ]] ; then
found=$e
break
fi
done
[[ $found ]] && echo "$found"
答案2
您可以切换到zsh
具有内置运算符的选项:
array=( "abcd" "01.wr" "ef_gh" xx.wr 99.wr )
第一的
$ print -rC1 -- $array[(r)[0-9][0-9].wr] 01.wr
最后的
$ print -rC1 -- $array[(R)[0-9][0-9].wr] 99.wr
第一个索引1:
$ print $array[(i)[0-9][0-9].wr] 2
最后一个索引²:
$ print $array[(I)[0-9][0-9].wr] 5
全部
$ print -rC1 -- ${(M)array:#[0-9][0-9].wr} 01.wr 99.wr
1 如果没有找到,则返回比最后一个元素的索引多 1 的值
² 如果没有找到,则返回0
答案3
如果您的组件不包含换行符,您可以执行以下操作
array=( "abcd" "01.wr" "ef_gh" )
printf "%s\n" "${array[@]}" | grep -E '^[[:digit:]]+\.wr$'
结果
01.wr
如果它们确实包含换行符,您可以使用 的grep
非标准扩展
array=( "abcd" "01.wr" $'44.zz\n9.p' "ef_gh" )
printf "%s\0" "${array[@]}" | grep -Exz '[[:digit:]]+\.wr'
结果
01.wr
对于短数组,效率会更高循环穿过它。对于大型数组,使用外部运算符可能grep
会更快。