Nan Hua
Nan Hua

Reputation: 3694

How to filter a bash array

Suppose I have a bash array

X=("a" "b c" "-d" "k j", "-f")

I want to filter by whether starting with "-" and get ("a" "b c" "k j") and ("-d" "-f") respectively.

How can I achieve that?

Upvotes: 8

Views: 6342

Answers (2)

3wordchant
3wordchant

Reputation: 586

From an answer to a similar question, you could do this:

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

From that answer:

The meat here is that IFS=$'\n' causes "${MY_ARR[*]}" to expand with newlines separating the items, so it can be piped through grep. In particular, this will handle spaces embedded inside the items of the array.

We then use grep / grep -v to filter in / out elements matching the pattern

Upvotes: 5

glenn jackman
glenn jackman

Reputation: 246847

I think you'll have to iterate through the array:

$ 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,

Upvotes: 11

Related Questions