首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:使用数组参数展开来包含项匹配模式

Bash:使用数组参数展开来包含项匹配模式
EN

Stack Overflow用户
提问于 2013-12-31 17:12:32
回答 2查看 257关注 0票数 1

我想使用数组上的bash参数展开来包含匹配给定模式的项,而不是排除它们。

下面是一个排除匹配ba*的项的示例

代码语言:javascript
复制
ar=( foo bar baz qux )
for i in ${ar[@]##ba*}; do
    echo "$i"
done

# foo
# qux

这一切都很好,但在本例中,我实际上只想包括与ba*匹配的项。

下面是我尝试过的,坦白地说,我不太清楚如何解释结果:

代码语言:javascript
复制
ar=( foo bar baz qux )
#shopt -s extglob  # seems to have no effect either way
for i in ${ar[@]##!(ba*)}; do
    echo "$i"
done

# ar
# az

看起来我在这种情况下,我得到了正确的项目,但他们的价值已经被咀嚼。

以下是我目前的工作解决方案:

代码语言:javascript
复制
ar=( foo bar baz qux )
for i in ${ar[@]}; do
    if [[ "$i" =~ ba* ]]; then
        echo "$i"
    fi
done

# bar
# baz

我正在使用Mac,并且已经在Mac捆绑bash 3.2.51以及安装了bash 4.2.45的国产操作系统上进行了测试。

谢谢!

编辑

@casc (正确)建议在下面重新添加从火柴中删除的'b‘,但这不是我想要的。

我的实际用例更像是包含与*ba*匹配的项,而不仅仅是ba*。关键是我不一定知道完整的字符串,只是它肯定会有模式ba*在某个地方。这可能是一个更好的例子:

代码语言:javascript
复制
ar=( foo zoobar waybaz qux )
for i in ${ar[@]}; do
    if [[ "$i" =~ ba* ]]; then
        # do something with $i
    fi
done

# zoobar
# waybaz
EN

回答 2

Stack Overflow用户

发布于 2013-12-31 17:28:34

从数组的每个元素中,删除与ba*不匹配的最长前缀。

  1. 对于fooqua,整个字符串不匹配。
  2. 对于barbazbba*不匹配,但ba匹配,因此只有b被删除。
票数 1
EN

Stack Overflow用户

发布于 2014-01-27 12:43:08

为什么不简单地把切断后的b再做一次呢?

代码语言:javascript
复制
(
shopt -s extglob
ar=( foo bar baz qux )
for i in ${ar[@]/#!(ba*)}; do
   echo "b${i}"
done
)

# ... or ...

(
export IFS=""
ar=( foo bar baz qux )
ar=( ${ar[@]/#!(ba*)} )
ar=( ${ar[@]/#/b} )
echo ${!ar[*]}
printf '%s\n' "${ar[@]}"
)

其他备选办法包括:

代码语言:javascript
复制
ar=( foo bar baz qux )
printf '%s\n' "${ar[@]}" "${ar[@]##ba*}" | sort | uniq -u
printf '%s\n' "${ar[@]}" "${ar[@]/#ba*}" | sort | uniq -u


# alternative to current working solution 
(
array=( foo bar baz qux )
for item in "${ar[@]}"; do
   case "$item" in
      ba*) echo "$item";;
        *) :;;
   esac
done
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20860850

复制
相关文章

相似问题

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