下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?

#!/bin/sh

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

当前回答

我知道这是一个非常古老的问题,但这里有另一个sed变体,它可能对某些人有用。不像其他的一些,它只替换开头或结尾的双引号…

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

如果您需要匹配单引号或双引号,并且只匹配正确引用的字符串。你可以使用这个稍微复杂一点的正则表达式…

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

这使用了反向引用,以确保结尾的引用与开头相同。

其他回答

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

echo $Linux
Output:
"amzn"

从变量中删除双引号的最简单方法是

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

All提供不带双引号的输出:

echo $ Linux

amzn

如果您试图删除引号,因为Makefile保留了它们,请尝试以下方法:

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

基于另一个答案:https://stackoverflow.com/a/10430975/10452175

使用tr删除“:

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

注意:这并没有完全回答问题,删除了所有双引号,而不仅仅是开头和结尾。请看下面的其他答案。

这是不使用sed的最离散的方式:

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

Or

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

输出:

   quotes: "fish"
no quotes:  fish

我从线人那里得到的。

STR='"0.0.0"' ## OR STR="\"0.0.0\""
echo "${STR//\"/}"
## Output: 0.0.0