下面是一个大脚本中的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
当前回答
Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`
echo $Linux
Output:
"amzn"
从变量中删除双引号的最简单方法是
Linux=`echo "$Linux" | tr -d '"'`
Linux=$(eval echo $Linux)
Linux=`echo ${Linux//\"/}`
Linux=`echo $Linux | xargs`
All提供不带双引号的输出:
echo $ Linux
amzn
其他回答
我使用这个正则表达式,避免从没有正确引用的字符串中删除引号,这里根据输入显示不同的输出,只有一个开始-结束引号受到影响:
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"<
这是不使用sed的最离散的方式:
x='"fish"'
printf " quotes: %s\nno quotes: %s\n" "$x" "${x//\"/}"
Or
echo $x
echo ${x//\"/}
输出:
quotes: "fish"
no quotes: fish
我从线人那里得到的。
我的版本
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
还有另一种方法。如:
echo ${opt:1:-1}
你只需要调用一次sed就可以做到:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\