use*_*746 188 unix string bash shell sed
下面是一个更大的脚本的shell脚本片段.它从变量保存的字符串中删除引号.我是用sed做的,效率高吗?如果不是那么有效的方法是什么?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
Run Code Online (Sandbox Code Playgroud)
wie*_*990 239
使用tr删除":
echo "$opt" | tr -d '"'
Run Code Online (Sandbox Code Playgroud)
注意:这将删除所有双引号,而不仅仅是前导和尾随.
hue*_*ois 229
使用本机shell前缀/后缀删除功能更简单有效:
temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"
Run Code Online (Sandbox Code Playgroud)
$ {opt%\"}将删除后缀"(使用反斜杠转义以防止shell解释)
$ {temp#\"}将删除前缀"(用反斜杠转义以防止shell解释)
另一个优点是,只有存在周围的引号时才会删除周围的引号.
顺便说一句,你的解决方案总是删除第一个和最后一个角色,无论它们是什么(当然,我确定你知道你的数据,但最好还是确定你要删除的东西).
使用sed:
echo "$opt" | sed -e 's/^"//' -e 's/"$//'
Run Code Online (Sandbox Code Playgroud)
(改进版,如jfgagne所示,摆脱回声)
sed -e 's/^"//' -e 's/"$//' <<<"$opt"
Run Code Online (Sandbox Code Playgroud)
所以它取而代之的是"没有任何东西,并且没有任何东西".在同一个调用中(不需要管道并启动另一个sed,使用-e可以进行多个文本处理).
kil*_*joy 78
如果您正在使用 jq 并尝试从结果中删除引号,则其他答案将起作用,但有更好的方法。通过使用该-r
选项,您可以输出不带引号的结果。
$ echo '{"foo": "bar"}' | jq '.foo'
"bar"
$ echo '{"foo": "bar"}' | jq -r '.foo'
bar
Run Code Online (Sandbox Code Playgroud)
Jeh*_*Ahn 56
如果您从 AWS CLI 来到这里--query
,请尝试此操作。--output text
use*_*520 24
使用xargs有一种直接的方式:
> echo '"quoted"' | xargs
quoted
Run Code Online (Sandbox Code Playgroud)
如果没有提供命令,xargs使用echo作为默认命令,并从输入中删除引号,请参见此处
Som*_*ude 19
只需拨打一次电话即可完成sed
:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
Run Code Online (Sandbox Code Playgroud)
Dr.*_*eon 17
最短的路 - 尝试:
echo $opt | sed "s/\"//g"
Run Code Online (Sandbox Code Playgroud)
它实际上删除了所有的"(双引号)"(opt
除了开头和结尾之外真的会有更多的双引号吗?所以,它实际上是同样的东西,而且更简短;-))
Kir*_*jan 14
Linux=`cat /etc/os-release | grep "ID" | head -1 | awk -F= '{ print $2 }'`
echo $Linux
Output:
"amzn"
Run Code Online (Sandbox Code Playgroud)
从变量中删除双引号的最简单方法是
Linux=`echo "$Linux" | tr -d '"'`
Run Code Online (Sandbox Code Playgroud)
Linux=$(eval echo $Linux)
Run Code Online (Sandbox Code Playgroud)
Linux=`echo ${Linux//\"/}`
Run Code Online (Sandbox Code Playgroud)
Linux=`echo $Linux | xargs`
Run Code Online (Sandbox Code Playgroud)
All 提供不带双引号的输出:
回显$Linux
亚马逊
更新
来自/sf/answers/1705087121/的简单而优雅的答案:
BAR=$(eval echo $BAR)
剥离报价BAR
.
================================================== ===========
根据hueybois的回答,经过多次试验和错误,我想出了这个功能:
function stripStartAndEndQuotes {
cmd="temp=\${$1%\\\"}"
eval echo $cmd
temp="${temp#\"}"
eval echo "$1=$temp"
}
Run Code Online (Sandbox Code Playgroud)
如果你不想要打印任何东西,你可以将这些遗言送到/dev/null 2>&1
.
用法:
$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
Run Code Online (Sandbox Code Playgroud)
在 Bash 中,您可以使用以下一行:
[[ "${var}" == \"*\" || "${var}" == \'*\' ]] && var="${var:1:-1}"
Run Code Online (Sandbox Code Playgroud)
这将从存储的字符串中删除周围的引号(单引号和双引号)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}"
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案bash
:
$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
Run Code Online (Sandbox Code Playgroud)
这称为子字符串扩展(请参阅Gnu Bash手册并搜索${parameter:offset:length}
)。在此示例中,它从子字符串s
开始于位置1到结束于倒数第二个位置。这是由于以下事实:如果length
为负值,则将其解释为相对于末尾的向后偏移parameter
。
我知道这是一个非常古老的问题,但这是另一个 sed 变体,它可能对某人有用。与其他一些不同,它只在开始或结束时替换双引号......
echo "$opt" | sed -r 's/^"|"$//g'
Run Code Online (Sandbox Code Playgroud)
如果不使用sed,这不是最离散的方式吗?
x='"fish"'
printf " quotes: %s\nno quotes: %s\n" "$x" "${x//\"/}"
Run Code Online (Sandbox Code Playgroud)
要么
echo $x
echo ${x//\"/}
Run Code Online (Sandbox Code Playgroud)
输出:
quotes: "fish"
no quotes: fish
Run Code Online (Sandbox Code Playgroud)
我从Source得到了这个
归档时间: |
|
查看次数: |
215658 次 |
最近记录: |