How can I grep complex strings in variables?

88,025

Solution 1

if echo "$long_str" | grep -q "$shrt_str";then
  echo "found"
fi

or

echo "$long_str" | grep  -q  "$shrt_str"  && echo "found" || echo "not found"

But since you are using bash shell, then use shell internals. No need to call external commands

shrt_str="guide"
case "$long_str" in 
   *"$shrt_str"* ) echo "Found";;
   * ) echo "Not found";;
esac

Solution 2

grep is for files or stdin. If you want to use a variable as stdin then you need to use bash's herestring notation:

if grep -q "$shrt_str" <<< "$long_str" ; then

Solution 3

You want

if echo $long_str | grep -q $shrt_str; then

Solution 4

Another Bash-specific technique:

if [[ $long =~ $short ]]    # regex match
then
    echo "yes"
fi

But if you don't need the long string in a variable:

if man man | grep $short; then ...

but I'm assuming that was just for the purpose of having an example.

Share:
88,025
Craig
Author by

Craig

Director, Compute Engineering at Oracle Cloud Infrastructure. [email protected]

Updated on October 03, 2020

Comments

  • Craig
    Craig over 3 years

    I am trying to grep for a small string in a much larger string. Both strings are being stored as variables and here is a code example:

    #!/bin/bash
    
    long_str=$(man man)
    shrt_str="guide"
    
    if grep -q $shrt_str $long_str ; then
            echo "Found it!"
    fi
    

    I don't think variable expansion is working the way I expect it to. I have tried [ ] and [[ ]], also quoting the variables and piping the output to /dev/null but no matter what I do it won't work.

    Does anyone have any ideas?