如何过滤bash数组

Nan*_*Hua 3 bash

假设我有一个 bash 数组

X=("a" "b c" "-d" "k j", "-f")
Run Code Online (Sandbox Code Playgroud)

我想是否与开始过滤"-",并得到 ("a" "b c" "k j")和("-d" "-f")分别。

我怎样才能做到这一点?

gle*_*man 7

我认为你必须遍历数组:

$ X=("a" "b c" "-d" "k j", "-f")
$ for elem in "${X[@]}"; do [[ $elem == -* ]] && with+=("$elem") || without+=("$elem"); done
$ printf "%s\n" "${with[@]}"
-d
-f
$ printf "%s\n" "${without[@]}"
a
b c
k j,
Run Code Online (Sandbox Code Playgroud)


3wo*_*ant 5

从类似问题的答案中,您可以这样做:

A=$((IFS=$'\n' && echo "${X[*]}") | grep '^-')
B=$((IFS=$'\n' && echo "${X[*]}") | grep -v '^-')
Run Code Online (Sandbox Code Playgroud)

从那个答案来看:

这里的重点是 IFS=$'\n' 导致“${MY_ARR[*]}”使用分隔项目的换行符进行扩展,因此可以通过 grep 进行管道传输。特别是,这将处理嵌入数组项内的空格。

然后我们使用grep/grep -v过滤入/出与模式匹配的元素