stringbashshellunixsed

Shell script - remove first and last quote (") from a variable


Below is the snippet of a shell script from a larger script. It removes the quotes from the string that is held by a variable. I am doing it using sed, but is it efficient? If not, then what is the efficient way?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

Solution

  • There's a simpler and more efficient way, using the native shell prefix/suffix removal feature:

    temp="${opt%\"}"
    temp="${temp#\"}"
    echo "$temp"
    

    ${opt%\"} will remove the suffix " (escaped with a backslash to prevent shell interpretation).

    ${temp#\"} will remove the prefix " (escaped with a backslash to prevent shell interpretation).

    Another advantage is that it will remove surrounding quotes only if there are surrounding quotes.

    BTW, your solution always removes the first and last character, whatever they may be (of course, I'm sure you know your data, but it's always better to be sure of what you're removing).

    Using sed:

    echo "$opt" | sed -e 's/^"//' -e 's/"$//'
    

    (Improved version, as indicated by jfgagne, getting rid of echo)

    sed -e 's/^"//' -e 's/"$//' <<<"$opt"
    

    So it replaces a leading " with nothing, and a trailing " with nothing too. In the same invocation (there isn't any need to pipe and start another sed. Using -e you can have multiple text processing).