Shell script-удаляет первую и последнюю кавычки ( " ) из переменной
Ниже приведен фрагмент сценария оболочки из более крупного сценария. Он удаляет кавычки из строки, которая удерживается переменной. Я делаю это с помощью sed, но эффективно ли это? Если нет, то каков же эффективный способ?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp



Ответы - Shell script-удаляет первую и последнюю кавычки ( " ) из переменной / Shell script - remove first and last quote (") from a variable

16.03.2012 11:21:08
Вы можете сделать это только одним звонком в sed
:
$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\

16.03.2012 11:27:23
Есть более простой и эффективный способ, используя функцию удаления префикса/суффикса собственной оболочки:
temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"
${opt%\"} удалит суффикс "
(экранированный обратной косой чертой, чтобы предотвратить интерпретацию оболочки).
${temp#\"} удалит префикс "
(экранированный с обратной косой чертой, чтобы предотвратить интерпретацию оболочки).
Еще одно преимущество заключается в том, что он будет удалять окружающие котировки только в том случае, если есть окружающие котировки.
Кстати, ваше решение всегда удаляет первый и последний символ, какими бы они ни были (конечно, я уверен, что вы знаете свои данные, но всегда лучше быть уверенным в том, что вы удаляете).
Использование sed:
echo "$opt" | sed -e 's/^"//' -e 's/"$//'
(Улучшенная версия, как указывает jfgagne, избавление от echo)
sed -e 's/^"//' -e 's/"$//' <<<"$opt"
Таким образом, он заменяет ведущую "
ни с чем", и замыкающую "
тоже ни с чем. В том же вызове (нет никакой необходимости трубить и запускать другой sed. С помощью -e
вы можете иметь многократную обработку текста).

sed -e 's/^"//' -e 's/"$//' <<< $opt
.



sed



sed 's/^"\|"$//g'

$REPLACEME=$(sed -e 's/^"//' -e 's/"$//' <<<"$REPLACEME")
, так что вы можете иметь рабочую переменную.


echo '"foo"' | sed 's/^"//;s/"$//'

16.03.2012 11:29:39
Самый короткий путь в обход-попробовать:
echo $opt | sed "s/\"//g"
Это фактически удаляет все "
s (двойные кавычки) из opt
(действительно ли будет больше двойных кавычек, кроме как в начале и в конце, хотя? Так что это на самом деле то же самое, и гораздо короче ;-))



08.06.2012 10:11:33
Это позволит удалить все двойные кавычки.
echo "${opt//\"}"





11.10.2014 04:52:23
Используйте tr для удаления "
:
echo "$opt" | tr -d '"'
Примечание: при этом удаляются все двойные кавычки, а не только лидирующие и трейлинговые.









12.07.2017 06:44:17
Моя версия
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
}
Функция принимает имена переменных и удаляет кавычки на месте. Он только удаляет совпадающую пару ведущих и замыкающих котировок. Он не проверяет, экранирована ли конечная цитата (предшествующая \
которая сама не экранирована).
По моему опыту, универсальные строковые утилиты, подобные этой (у меня есть их библиотека), наиболее эффективны при непосредственном манипулировании строками, не используя никакого сопоставления шаблонов и особенно не создавая никаких суб-оболочек или вызывая любые внешние инструменты , такие как 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

08.09.2017 02:03:05
Обновление
Простой и элегантный ответ от удаления одинарных и двойных кавычек в строке, используя только команды bash / standard Linux:
BAR=$(eval echo $BAR)
выводит котировки из BAR
.
=============================================================
Основываясь на ответе уэйбуа, я придумал эту функцию после многих проб и ошибок:
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





04.06.2019 04:34:42
Самое простое решение в баше:
$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
Это называется расширением подстроки (см. Руководство Gnu Bash и поиск ${parameter:offset:length}
). В этом примере он берет подстроку из s
, начинающуюся в позиции 1 и заканчивающуюся во второй последней позиции. Это связано с тем, что если length
-отрицательное значение, то оно интерпретируется как обратное смещение от конца parameter
.

06.02.2020 11:37:22
Если вы используете jq и пытаетесь удалить кавычки из результата, другие ответы будут работать, но есть лучший способ. Используя опцию-r
, вы можете вывести результат без кавычек.
$ echo '{"foo": "bar"}' | jq '.foo'
"bar"
$ echo '{"foo": "bar"}' | jq -r '.foo'
bar