Shell Script-удалить первую и последнюю кавычки ( " ) из переменной
Ниже приведен фрагмент скрипта из скрипта. Он удаляет кавычки из строки, которая хранится в переменной. Я делаю это с помощью sed, это эффективно? Если нет, то каков эффективный путь?
#!/bin/sh
opt=""htmltest\""
temp=`echo $opt | sed 's/.(.*)//' | sed 's/(.*).//'`
echo $temp
9 ответов
есть более простой и эффективный, используя собственную функцию удаления префикса/суффикса оболочки:
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 вы можете иметь несколько текстов обработка.)
используйте tr для удаления ":
echo "$opt" | tr -d '"'
Примечание: это удаляет все двойные кавычки, а не только ведущие и трейлинг.
вы можете сделать это только с одним вызовом sed
:
$ echo "\"html\test\\"" | sed 's/^"\(.*\)"$//'
html\test\
самый короткий путь вокруг - попробуйте :
echo $opt | sed "s/\"//g"
он фактически удаляет все " (двойные кавычки) из opt
(действительно ли будет больше двойных кавычек, кроме как в начале и конце? так, это на самом деле то же самое, и гораздо более краток ;-))
обновление
простой и элегантный ответ от https://stackoverflow.com/a/24358387/1161743:
BAR=$(eval echo $BAR)
полоски цитаты из BAR
.
=============================================================
основываясь на ответе hueybois, я придумал эту функцию после многих проб и ошибок:
function stripStartAndEndQuotes {
cmd="temp=${%\\"}"
eval echo $cmd
temp="${temp#\"}"
eval echo "=$temp"
}
если вы не хотите ничего распечатывать, вы можете передать evals /dev/null 2>&1
.
использование:
$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
разве это не самый дискретный способ без использования sed?
x='"fish"'
printf " quotes: %s\nno quotes: %s\n" "$x" "${x//\"/}"
или
echo $x
echo ${x//\"/}
выход:
quotes: "fish"
no quotes: fish
получил от источник
существует прямой путь, используя xargs:
> echo '"quoted"' | xargs
quoted
xargs использует echo в качестве команды по умолчанию, если команда не указана и удаляет кавычки из ввода, см., например,здесь
моя версия
strip_quotes() {
while [[ $# -gt 0 ]]; do
local value=${!1}
local len=${#value}
[[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g ="${value:1:$len-2}"
shift
done
}
функция принимает имя (имена) переменной и удаляет кавычки на месте. Это только обнажает пары начальных и конечных предложений. Он не проверяет, экранирована ли конечная котировка (предшествующая \
который сам не избежал).
по моему опыту, универсальные функции string utility, подобные этому (у меня есть библиотека из них), наиболее эффективны при непосредственном манипулировании строками, не используя никакого сопоставления шаблонов и особенно не создавая никаких под-оболочек или вызывая любые внешние инструменты, такие как 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