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

后端 未结 15 1729
刺人心
刺人心 2020-11-30 16:47

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?

相关标签:
15条回答
  • 2020-11-30 17:28

    Use tr to delete ":

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

    Note: This removes all double quotes, not just leading and trailing.

    0 讨论(0)
  • 2020-11-30 17:28

    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.

    0 讨论(0)
  • 2020-11-30 17:29

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

    0 讨论(0)
  • 2020-11-30 17:32

    In Bash, I would use the following one-liner:

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

    This will remove surrounding quotes (both single and double) while keeping quoting characters inside the string intact. Also, it won't do anything if there's only a single leading quote or only a single trailing quote, which is usually what you want in my experience.

    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="$*"
    echo "Before: ${str}"
    strip_quotes str
    echo "After:  ${str}"
    
    0 讨论(0)
  • 2020-11-30 17:35

    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'
    
    0 讨论(0)
  • 2020-11-30 17:35

    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
    
    0 讨论(0)
提交回复
热议问题