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

Примечание: это удаляет все двойные кавычки, а не только ведущие и трейлинг.


это удалит все двойные кавычки.

echo "${opt//\"}"

вы можете сделать это только с одним вызовом 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