Home > database >  Shell: Filter list by array of sed expressions
Shell: Filter list by array of sed expressions

Time:07-13

I have a list like this:

> echo $candidates
ENV-NONPROD-SANDBOX
ENV-NONPROD-SANDBOX-SECRETS
ENV-NONPROD-DEMO
ENV-NONPROD-DEMO-SECRETS
ENV-PROD-EU
ENV-PROD-EU-SECRETS
ENV-PROD-US
ENV-PROD-US-SECRETS

I also have a dynamically created list of expressions which I want to apply as filters (AND) to narrow that list to possible candidates:

$ filters=('/-SECRETS/!d' '/-NONPROD/!d') # static exanmple

Then I concatenate this and try to apply, but that does not work:

$ filterParam=$(printf "-e '%s' " "${filters[@]}")
$ echo $filterParam
-e "/-SECRETS/!d" -e "/-NONPROD/!d"

$ echo "$candidates" | sed $filterParam
sed: 1: " '/-SECRETS/\!d'  ...": invalid command code '

The strange thing: If I execute it manually, it works!

> echo "$candidates" | sed -e "/-SECRETS/!d" -e "/-NONPROD/!d"
ENV-NONPROD-SANDBOX-SECRETS
ENV-NONPROD-DEMO-SECRETS

I execute this on macOS and zsh 5.8.1 (x86_64-apple-darwin21.0)

CodePudding user response:

filterParam=$(printf "-e '%s' "

No, you can't store command line arguments in variables. Read https://mywiki.wooledge.org/BashFAQ/050 .

You can use bash arrays, which you already use to store filters, so just use them:

sedargs=()
for i in "${filters[@]}"; do
   sedargs =(-e "$i")
done
sed "${sedargs[@]}"

But sed is sed, just join array elements with a newline or a semicolon, which delimits sed expressions:

sed "$(printf "%s\n" "${filters[@]}")"
  •  Tags:  
  • bash
  • Related