3

I have this code that does work:

get_parameter ()
{
   echo "$query" | sed -n 's/^.*name=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"
}

But I want to replace the "name" with the parameter that I pass to get_parameter

get_parameter ()
{
   echo "$query" | sed -n 's/^.*$1=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"
}
NAME=$( get_parameter name )

This however, doesn't work. Where am I wrong?

2
5

As l0b0 pointed, you can't use single quotes here. Apart from that, in your example you don't have to use sed either. It looks far cleaner with grep:

get_parameter ()
{
   echo "$query" | grep -o "${1}=[^&]*" | sed "s/%20/ /g"
}

Without echo:

get_parameter ()
{
   <<< "$query" grep -o "${1}=[^&]*" | sed "s/%20/ /g"
}

And finally, without the second sed (just bash):

get_parameter ()
{
   <<< "${query//%20/ }" grep -o "${1}=[^&]*"
}
4

Quoting: In short, variables are not replaced with their values inside 'single-quoted' strings (aka. "variable substitution"). You need to use any one of "double quotes", $'dollar quotes', or

<<EOF
here strings
EOF
0

change:

echo "$query" | sed -n 's/^.*$1=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"

to:

echo "$query" | sed -n 's/^.*'"$1"'=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"
0

You can concating it with rest command by replace name with '$1' like the following:

sed -n 's/^.*'$1'=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"
3
  • Note that you are leaving $1 unquoted in the shell.
    – they
    Dec 25 '21 at 21:04
  • @they I know and that is the right way to write it!! Also, I am already using it with the same syntax, so you might misunderstand it!! Dec 25 '21 at 21:17
  • To quote the expansion of $1 in your command, use sed -n 's/^.*'"$1"'=\([^&]*\).*$/\1/p' | sed "s/%20/ /g". Test your command with $1 set to the string 1 2 3. Then also test with * and / and add a caveat to you answer about how $1 would be interpreted as a regular expression, and that it can't contain the delimiter used with the substitution command, and what to do instead.
    – they
    Dec 25 '21 at 21:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.