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

#!/bin/sh

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

当前回答

还有另一种方法。如:

echo ${opt:1:-1}

其他回答

你只需要调用一次sed就可以做到:

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

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

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

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

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

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

还有另一种方法。如:

echo ${opt:1:-1}

如果您正在使用jq并试图从结果中删除引号,那么其他答案也可以工作,但还有更好的方法。通过使用-r选项,可以输出不带引号的结果。

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

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar
STR='"0.0.0"' ## OR STR="\"0.0.0\""
echo "${STR//\"/}"
## Output: 0.0.0