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,或者调用任何外部工具(如sedawkgrep

 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