下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
下面是一个大脚本中的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
其他回答
我使用这个正则表达式,避免从没有正确引用的字符串中删除引号,这里根据输入显示不同的输出,只有一个开始-结束引号受到影响:
echo '"only first' | sed 's/^"\(.*\)"$/\1/'
输出:>"only first<
echo 'only last"' | sed 's/^"\(.*\)"$/\1/'
输出:>"only last"<
echo '"both"' | sed 's/^"\(.*\)"$/\1/'
输出:> <
echo '"space after" ' | sed 's/^"\(.*\)"$/\1/'
输出:>"space after" <
echo ' "space before"' | sed 's/^"\(.*\)"$/\1/'
输出:> "space before"<
还有另一种方法。如:
echo ${opt:1:-1}
你只需要调用一次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可以进行多个文本处理)。
捷径——试试:
echo $opt | sed "s/\"//g"
它实际上从opt中删除了所有的“s(双引号)(除了开头和结尾之外,真的会有更多的双引号吗?所以这实际上是一样的事情,更简短;-))