下面是一个大脚本中的shell脚本片段。它从变量持有的字符串中删除引号。我正在使用sed,但它是有效的吗?如果不是,那么什么是有效的方法?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

当前回答

如果您正在使用jq并试图从结果中删除引号,那么其他答案也可以工作,但还有更好的方法。通过使用-r选项,可以输出不带引号的结果。

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

其他回答

我使用这个正则表达式,避免从没有正确引用的字符串中删除引号,这里根据输入显示不同的输出,只有一个开始-结束引号受到影响:

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"<

还有另一种方法。如:

echo ${opt:1:-1}

使用xargs有一个简单的方法:

> echo '"quoted"' | xargs
quoted

如果没有提供命令,Xargs使用echo作为默认命令,并从输入中删除引号,参见这里的例子。但是请注意,这只在字符串不包含附加引号的情况下才有效。在这种情况下,它要么失败(引号数量不均匀),要么删除所有引号。

使用tr删除“:

 echo "$opt" | tr -d '"'

注意:这并没有完全回答问题,删除了所有双引号,而不仅仅是开头和结尾。请看下面的其他答案。

如果您正在使用jq并试图从结果中删除引号,那么其他答案也可以工作,但还有更好的方法。通过使用-r选项,可以输出不带引号的结果。

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar