下面是一个大脚本中的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
当前回答
在Bash中,你可以使用下面的一行代码:
[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
这将从存储在var中的字符串中删除周围的引号(单引号和双引号),同时保持字符串中的引号字符完整。同样,如果只有一个前引号或只有一个后引号,或者在开始/结束处有混合引号字符,这将不起任何作用。
包装在函数中:
#!/usr/bin/env bash
# Strip surrounding quotes from string [$1: variable name]
function strip_quotes() {
local -n var="$1"
[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
}
str="'hello world'"
echo "Before: ${str}"
strip_quotes str
echo "After: ${str}"
其他回答
我使用这个正则表达式,避免从没有正确引用的字符串中删除引号,这里根据输入显示不同的输出,只有一个开始-结束引号受到影响:
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"<
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
有一个更简单、更有效的方法,使用本机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可以进行多个文本处理)。
Bash中最简单的解决方案:
$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
这被称为子字符串展开(参见Gnu Bash手册并搜索${parameter:offset:length})。在这个例子中,它从s获取子字符串,从位置1开始,到最后第二个位置结束。这是因为,如果length为负值,则它将被解释为从参数末尾开始的向后运行偏移。
如果您正在使用jq并试图从结果中删除引号,那么其他答案也可以工作,但还有更好的方法。通过使用-r选项,可以输出不带引号的结果。
$ echo '{"foo": "bar"}' | jq '.foo'
"bar"
$ echo '{"foo": "bar"}' | jq -r '.foo'
bar