下面是一个更大的脚本的shell脚本片段。它从变量保存的字符串中删除引号。我是用sed做的,效率高吗?如果不是那么有效的方法是什么?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
使用本机shell前缀/后缀删除功能更简单有效:
temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"
$ {opt%\“}将删除后缀”(使用反斜杠转义以防止shell解释)
$ {temp#\“}将删除前缀”(使用反斜杠转义以防止shell解释)
另一个优点是,只有存在周围的引号时才会删除周围的引号。
顺便说一句,你的解决方案总是删除第一个和最后一个角色,无论它们是什么(当然,我确定你知道你的数据,但最好还是确定你要删除的东西)。
使用sed:
echo "$opt" | sed -e 's/^"//' -e 's/"$//'
(改进版,如jfgagne所示,摆脱回声)
sed -e 's/^"//' -e 's/"$//' <<<"$opt"
所以它取而代之的是“没有任何东西,并且没有任何东西”。在同一个调用中(不需要管道并启动另一个sed,使用-e可以进行多个文本处理)。
最简单的解决方案
$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
使用tr删除“:
echo "$opt" | tr -d '"'
注意:这将删除所有双引号,而不仅仅是前导和尾随。
这将删除所有双引号。
echo "${opt//\"}"
只需拨打一次sed
即可完成此操作:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
最短的路 - 尝试:
echo $opt | sed "s/\"//g"
它实际上从opt
删除所有“(双引号)”(除了在开头和结尾之外,真的会有更多的双引号吗?所以,它实际上是相同的东西,更简单;-))
更新
来自https://stackoverflow.com/a/24358387/1161743的简单而优雅的答案:
BAR=$(eval echo $BAR)
剥离了BAR
的报价。
=============================================================
根据hueybois的回答,经过多次试验和错误,我想出了这个功能:
function stripStartAndEndQuotes {
cmd="temp=\${$1%\\\"}"
eval echo $cmd
temp="${temp#\"}"
eval echo "$1=$temp"
}
如果你不想要打印任何东西,你可以把这些遗言送到/dev/null 2>&1
。
用法:
$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
如果不使用sed,这不是最离散的方式吗?
x='"fish"'
printf " quotes: %s\nno quotes: %s\n" "$x" "${x//\"/}"
要么
echo $x
echo ${x//\"/}
输出:
quotes: "fish"
no quotes: fish
我从Source得到了这个
我的版本
strip_quotes() {
while [[ $# -gt 0 ]]; do
local value=${!1}
local len=${#value}
[[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
shift
done
}
该函数接受变量名称并在适当的位置删除引号。它只删除一对匹配的前导和尾随引号。它不会检查尾随引号是否被转义(前面是\
,它本身不会被转义)。
根据我的经验,这样的通用字符串实用程序函数(我有一个库)在直接操作字符串时最有效,不使用任何模式匹配,特别是不创建任何子shell,或调用任何外部工具,如sed
,awk
或grep
。
var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
echo $i="${!i}"
done