Shell脚本 – 从variables中删除第一个和最后一个引号(“)
下面是一个更大的脚本的shell脚本的片段。 它从由variables持有的string中删除引号。 我正在使用sed,这是否有效? 如果不是那么有效的方法是什么?
#!/bin/sh opt="\"html\\test\\\"" temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'` echo $temp
使用本机shell前缀/后缀删除function更简单高效:
temp="${opt%\"}" temp="${temp#\"}" echo "$temp"
$ {opt%\“}将删除后缀”(用反斜线转义以防止shell解释)
$ {temp#\“}将删除前缀”(用反斜线转义以防止shell解释)
另一个好处是只有在有周边报价的情况下,才会删除周围的报价。
顺便说一句,你的解决scheme总是删除第一个和最后一个字符,不pipe它们是什么(当然,我相信你知道你的数据,但最好确定你要删除的东西)。
使用sed:
echo "$opt" | sed -e 's/^"//' -e 's/"$//'
(改进版本,如jfgagne所示,摆脱回声)
sed -e 's/^"//' -e 's/"$//' <<<"$opt"
因此,它没有任何东西取代领先的“无所有,无尾”。 在同一个调用中(不需要pipe道和启动另一个sed,使用-e你可以有多个文本处理)。
使用tr删除“:
echo "$opt" | tr -d '"'
这将删除所有双引号。
echo "${opt//\"}"
你可以只用一个电话给sed
:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/' html\test\
最短的path – 尝试:
echo $opt | sed "s/\"//g"
它实际上删除所有的“(双引号)从opt
(除了在开始和结束,是否真的会有更多的双引号?所以,它实际上是同样的事情,更简短;-))
这不是没有使用sed最离散的方式吗?
x='"fish"' printf " quotes: %s\nno quotes: %s\n" "$x" "${x//\"/}"
要么
echo $x echo ${x//\"/}
输出:
quotes: "fish" no quotes: fish
我从Source获得了这个
更新
从https://stackoverflow.com/a/24358387/1161743简单和优雅的答案:;
BAR=$(eval echo $BAR)
从BAR
删除引号。
================================================== ===========
基于hueybois的回答,经过多次反复试验,我想出了这个function:
function stripStartAndEndQuotes { cmd="temp=\${$1%\\\"}" eval echo $cmd temp="${temp#\"}" eval echo "$1=$temp" }
如果你不想打印出任何东西,你可以将这个evals传递给/dev/null 2>&1
。
用法:
$ BAR="FOO BAR" $ echo BAR "FOO BAR" $ stripStartAndEndQuotes "BAR" $ echo BAR FOO BAR
我的版本
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 }
该函数接受variables名称并剥离引号。 它只能剥去一对匹配的前导和尾随引号。 它不检查尾部引号是否被转义(在\
之前,本身没有转义)。
根据我的经验,像这样的通用string实用函数(我有它们的一个库)在直接操作string,不使用任何模式匹配,特别是不创build子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