下面是一个大脚本中的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
当前回答
使用tr删除“:
echo "$opt" | tr -d '"'
注意:这并没有完全回答问题,删除了所有双引号,而不仅仅是开头和结尾。请看下面的其他答案。
其他回答
如果您正在使用jq并试图从结果中删除引号,那么其他答案也可以工作,但还有更好的方法。通过使用-r选项,可以输出不带引号的结果。
$ echo '{"foo": "bar"}' | jq '.foo'
"bar"
$ echo '{"foo": "bar"}' | jq -r '.foo'
bar
使用tr删除“:
echo "$opt" | tr -d '"'
注意:这并没有完全回答问题,删除了所有双引号,而不仅仅是开头和结尾。请看下面的其他答案。
捷径——试试:
echo $opt | sed "s/\"//g"
它实际上从opt中删除了所有的“s(双引号)(除了开头和结尾之外,真的会有更多的双引号吗?所以这实际上是一样的事情,更简短;-))
还有另一种方法。如:
echo ${opt:1:-1}
有一个更简单、更有效的方法,使用本机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可以进行多个文本处理)。