Search code examples
shellkshcommand-substitution

How do I include a variable in a ksh command subtitution?


I'm trying to find a number of lines that match a regex pattern in grep received as a variable. When I do the grep with the pattern directly in the command substitution, it works. When I use a variable for the pattern, it doesn't.

#!/bin/bash

pattern="'^\\\".*\\\"$'"
echo "pattern : $(echo $pattern)"
NB=$(grep -c -E -v -e ${pattern} abc.txt)
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)
echo " -> $NB , $NB2"

Besides what's in the code, I've tried:

NB=$(grep -c -E -v -e $(echo $pattern) abc.txt)

No success.

cmd="grep -c -E -v -e ${pattern} abc.txt"
NB="$($cmd)"

No success.

In the example, abc.txt file contains 3 lines:

"abc"
"abc
abc"

The pattern in the variable seems ok:

pattern : '^\".*\"$'

I'm expecting that the 2 numbers in NB and NB2 are the same. If you look in the code, the actual result is:

pattern : '^\".*\"$'
 -> 3 , 2

I expect:

pattern : '^\".*\"$'
 -> 2 , 2

Solution

  • NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)
    

    If that works, then assign that exact regex to $pattern. Don't add more backslashes and quotes.

    pattern='^\".*\"$'
    

    It's always a good idea to quote variable expansions to prevent unwanted wildcard expansion and word splitting.

    NB=$(grep -c -E -v -e "${pattern}" abc.txt)
    #                     ^          ^