How can I grep complex strings in variables?
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.
Craig
Director, Compute Engineering at Oracle Cloud Infrastructure. [email protected]
Updated on October 03, 2020Comments
-
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?