user356866
user356866

Reputation: 103

How should I get bash 3.2 to find a pattern between wildcards

Trying to compare input to a file containing alert words,

read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
# the wildcards in my expression do not work
if [[ $MYINPUT =~ *$X* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

Upvotes: 0

Views: 181

Answers (3)

Andrey Starodubtsev
Andrey Starodubtsev

Reputation: 5292

If you want to use patterns, not regexes for matching, you can use case:

read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
  # the wildcards in my expression do not work
  case "$MYINPUT" in
    *$X* ) echo "#1 matched" ;;
    * ) echo  "#1 nope" ;;
  esac
done

Upvotes: 0

je4d
je4d

Reputation: 7838

I'd avoid =~ here because as FatalError points out, it will interpret $X as a regular expression and this can lead to surprising bugs (especially since it's an extended regular expression, so it has more special characters than standard grep syntax).

Instead, you can just use == because bash treats the RHS of == as a globbing pattern:

read MYINPUT
alertWords=($(<"AlertWordList"))
for X in "${alertWords[@]}"
do
# the wildcards in my expression do work :-)
if [[ $MYINPUT == *"$X"* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

I've also removed a use of cat in your alertWords assignment, as it keeps the file reading inside the shell instead of spawning another process to do it.

Upvotes: 1

FatalError
FatalError

Reputation: 54561

The =~ operator deals with regular expressions, and so to do a wildcard match like you wanted, the syntax would look like:

if [[ $MYINPUT =~ .*$X.* ]]

However, since this is regex, that's not needed, as it's implied that it could be anywhere in the string (unless it's anchored using ^ and/or $, so this should suffice:

if [[ $MYINPUT =~ $X ]]

Be mindful that if your "words" happen to contain regex metacharacters, then this might do strange things.

Upvotes: 2

Related Questions