如何使用部分字符串匹配从 bash 数组返回元素?

如何使用部分字符串匹配从 bash 数组返回元素?

我有一个包含多个元素的 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会更快。

相关内容