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

StringBashShellUnixSed

String Problem Overview


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

String Solutions


Solution 1 - String

Use tr to delete ":

 echo "$opt" | tr -d '"'

NOTE: This does not fully answer the question, removes all double quotes, not just leading and trailing. See other answers below.

Solution 2 - String

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).

Solution 3 - String

If you're using jq and trying to remove the quotes from the result, the other answers will work, but there's a better way. By using the -r option, you can output the result with no quotes.

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

Solution 4 - String

There is a straightforward way using xargs:

> echo '"quoted"' | xargs
quoted

xargs uses echo as the default command if no command is provided and strips quotes from the input, see e.g. here. Note, however, that this will work only if the string does not contain additional quotes. In that case it will either fail (uneven number of quotes) or remove all of them.

Solution 5 - String

The shortest way around - try:

echo $opt | sed "s/\"//g"

It actually removes all "s (double quotes) from opt (are there really going to be any more double quotes other than in the beginning and the end though? So it's actually the same thing, and much more brief ;-))

Solution 6 - String

You can do it with only one call to sed:

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\

Solution 7 - String

The easiest solution in Bash:

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

This is called substring expansion (see Gnu Bash Manual and search for ${parameter:offset:length}). In this example it takes the substring from s starting at position 1 and ending at the second last position. This is due to the fact that if length is a negative value it is interpreted as a backwards running offset from the end of parameter.

Solution 8 - String

If you come here for aws cli --query, try --output text.

Solution 9 - String

Update

A simple and elegant answer from https://stackoverflow.com/questions/758031/stripping-single-and-double-quotes-in-a-string-using-bash-standard-linux-comma/24358387#24358387:

BAR=$(eval echo $BAR) strips quotes from BAR.

=============================================================

Based on hueybois's answer, I came up with this function after much trial and error:

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

If you don't want anything printed out, you can pipe the evals to /dev/null 2>&1.

Usage:

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR

Solution 10 - String

This is the most discrete way without using sed:

x='"fish"'
printf "   quotes: %s\nno quotes:  %s\n" "$x" "${x//\"/}"

Or

echo $x
echo ${x//\"/}

Output:

   quotes: "fish"
no quotes:  fish

I got this from [a source][1].

[1]: http://www.linuxquestions.org/questions/programming-9/remove-double-quotes-bash-892703/ "source"

Solution 11 - String

Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`

echo $Linux
Output:
"amzn"

Simplest ways to remove double quotes from variables are

Linux=`echo "$Linux" | tr -d '"'` 
Linux=$(eval echo $Linux)
Linux=`echo ${Linux//\"/}`
Linux=`echo $Linux | xargs`

All provides the Output without double quotes:

echo $Linux

amzn

Solution 12 - String

I know this is a very old question, but here is another sed variation, which may be useful to someone. Unlike some of the others, it only replaces double quotes at the start or end...

echo "$opt" | sed -r 's/^"|"$//g'

If you need to match single or double quotes, and only strings that are properly quoted. You can use this slightly more complex regex...

echo $opt | sed -E "s|^(['\"])(.*)\1$|\2|g"

This uses backrefences to ensure the quote at the end is the same as at the start.

Solution 13 - String

In Bash, you could use the following one-liner:

[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"

This will remove surrounding quotes (both single and double) from the string stored in var while keeping quote characters inside the string intact. Also, this won't do anything if there's only a single leading quote or only a single trailing quote or if there are mixed quote characters at start/end.


Wrapped in a function:

#!/usr/bin/env bash

# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
    local -n var="$1"
    [[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}

str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"

Solution 14 - String

My version

strip_quotes() {
	while [[ $# -gt 0 ]]; do
		local value=${!1}
		local len=${#value}
		[[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
		shift
	done
}

The function accepts variable name(s) and strips quotes in place. It only strips a matching pair of leading and trailing quotes. It doesn't check if the trailing quote is escaped (preceded by \ which is not itself escaped).

In my experience, general-purpose string utility functions like this (I have a library of them) are most efficient when manipulating the strings directly, not using any pattern matching and especially not creating any sub-shells, or calling any external tools such as sed, awk or grep.

var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
	echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
	echo $i="${!i}"
done

Solution 15 - String

I use this regular expression, which avoids removing quotes from strings that are not properly quoted, here the different outputs are shown depending on the inputs, only one with begin-end quote was affected:

echo '"only first' | sed 's/^"\(.*\)"$/\1/'

Output: >"only first<

echo 'only last"' | sed 's/^"\(.*\)"$/\1/'

Output: >"only last"<

echo '"both"' | sed 's/^"\(.*\)"$/\1/'

Output: >both<

echo '"space after" ' | sed 's/^"\(.*\)"$/\1/'

Output: >"space after" <

echo ' "space before"' | sed 's/^"\(.*\)"$/\1/'

Output: > "space before"<

Solution 16 - String

There is another way to do it. Like:

echo ${opt:1:-1}

Solution 17 - String

If you try to remove quotes because the Makefile keeps them, try this:

$(subst $\",,$(YOUR_VARIABLE))

Based on another answer: https://stackoverflow.com/a/10430975/10452175

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1263746View Question on Stackoverflow
Solution 1 - Stringwieczorek1990View Answer on Stackoverflow
Solution 2 - StringhuelboisView Answer on Stackoverflow
Solution 3 - StringkilljoyView Answer on Stackoverflow
Solution 4 - Stringuser1587520View Answer on Stackoverflow
Solution 5 - StringDr.KameleonView Answer on Stackoverflow
Solution 6 - StringSome programmer dudeView Answer on Stackoverflow
Solution 7 - StringHiro.ProtagonistView Answer on Stackoverflow
Solution 8 - StringJehong AhnView Answer on Stackoverflow
Solution 9 - StringJonathan LinView Answer on Stackoverflow
Solution 10 - Stringnimig18View Answer on Stackoverflow
Solution 11 - StringKiruthika kanagarajanView Answer on Stackoverflow
Solution 12 - Stringuser1751825View Answer on Stackoverflow
Solution 13 - StringMaxximView Answer on Stackoverflow
Solution 14 - StringGene PavlovskyView Answer on Stackoverflow
Solution 15 - StringFederico FirenzeView Answer on Stackoverflow
Solution 16 - StringDevilTourView Answer on Stackoverflow
Solution 17 - StringJames BondView Answer on Stackoverflow