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

#!/bin/sh

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

当前回答

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

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

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

其他回答

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

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

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

有一个更简单、更有效的方法,使用本机shell前缀/后缀删除功能:

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

${opt%\"}将删除后缀"(用反斜杠转义以防止shell解释)。

${temp#\"}将删除前缀"(用反斜杠转义以防止shell解释)。

另一个优点是,它只会删除周围的引号,如果有周围的引号。

顺便说一句,你的解决方案总是删除第一个和最后一个字符,无论它们是什么(当然,我相信你知道你的数据,但最好总是确定你要删除什么)。

使用sed:

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

(改进版本,如jfgagne所示,去掉了echo)

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

因此,它将开头的“nothing”替换为“nothing”,后面的“尾随”也替换为“nothing”。在同一个调用中(不需要管道和启动另一个sed)。使用-e可以进行多个文本处理)。

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

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
STR='"0.0.0"' ## OR STR="\"0.0.0\""
echo "${STR//\"/}"
## Output: 0.0.0 

Bash中最简单的解决方案:

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

这被称为子字符串展开(参见Gnu Bash手册并搜索${parameter:offset:length})。在这个例子中,它从s获取子字符串,从位置1开始,到最后第二个位置结束。这是因为,如果length为负值,则它将被解释为从参数末尾开始的向后运行偏移。