Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter a bash array

Tags:

bash

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?

like image 366
Nan Hua Avatar asked Dec 25 '22 07:12

Nan Hua


2 Answers

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,
like image 96
glenn jackman Avatar answered Jan 03 '23 04:01

glenn jackman


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

like image 28
3wordchant Avatar answered Jan 03 '23 04:01

3wordchant