下面是一个大脚本中的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

其他回答

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

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

有一个更简单、更有效的方法,使用本机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 "$opt" | sed -r 's/^"|"$//g'

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

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

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

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

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

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

捷径——试试:

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

它实际上从opt中删除了所有的“s(双引号)(除了开头和结尾之外,真的会有更多的双引号吗?所以这实际上是一样的事情,更简短;-))