Shell Script - удалить первую и последнюю цитату (") из переменной

Ниже приведен фрагмент оболочки script из более крупного script. Он удаляет кавычки из строки, удерживаемой переменной. Я делаю это с помощью sed, он эффективен? Если нет, то каков эффективный способ?

#!/bin/sh

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

Ответ 1

Там более простой и эффективный, используя встроенную префикс оболочки/удаление суффикса:

temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"

${opt%\ "} удалит суффикс" (экранированный с обратной косой чертой для предотвращения интерпретации оболочки)

${temp #\ "} удалит префикс" (экранированный обратным слэшем для предотвращения интерпретации оболочки)

Другим преимуществом является то, что он удалит окружные кавычки только в том случае, если есть окружающие кавычки.

BTW, ваше решение всегда удаляет первый и последний персонажи, какими бы они ни были (конечно, я уверен, что вы знаете свои данные, но всегда лучше быть уверенным в том, что вы удаляете).

Использование sed:

echo "$opt" | sed -e 's/^"//' -e 's/"$//'

(улучшенная версия, как указано jfgagne, избавление от эха)

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

Таким образом, он заменяет лидирующие "ничем и ничем не занимающимися" ни с чем. В том же вызове (нет необходимости подключать и запускать другое sed, используя -e вы можете иметь многократную обработку текста).

Ответ 2

Используйте tr для удаления ":

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

ПРИМЕЧАНИЕ. При этом удаляются все двойные кавычки, а не только начальные и конечные.

Ответ 3

Это приведет к удалению всех двойных кавычек.

echo "${opt//\"}"

Ответ 4

Существует прямой путь использования xargs:

> echo '"quoted"' | xargs
quoted

xargs использует echo в качестве команды по умолчанию, если команда не указана, и удаляет кавычки из входных данных, см., например, здесь

Ответ 5

Вы можете сделать это только с одним вызовом sed:

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\

Ответ 6

Самый короткий путь - попробуйте:

echo $opt | sed "s/\"//g"

Он фактически удаляет все "(двойные кавычки)) из opt (действительно ли будут какие-то более двойные кавычки, кроме как в начале и в конце?), поэтому на самом деле это одно и то же, и гораздо более краткое; -))

Ответ 7

Обновление

Простой и элегантный ответ от fooobar.com/questions/61556/...:

BAR=$(eval echo $BAR) разделяет цитаты из BAR.

=============================================== ==============

Основываясь на ответе на hueybois, я придумал эту функцию после долгих проб и ошибок:

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

Ответ 8

Разве это не самый дискретный способ без использования sed?

x='"fish"'
printf "   quotes: %s\nno quotes:  %s\n" "$x" "${x//\"/}"

ИЛИ ЖЕ

echo $x
echo ${x//\"/}

выход:

   quotes: "fish"
no quotes:  fish

Я получил это из источника

Ответ 9

Самое простое решение в bash:

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

Это называется расширением подстроки (см. Руководство по Gnu Bash и поиск ${parameter:offset:length}). В этом примере он берет подстроку из s, начиная с позиции 1 и заканчивая второй последней позицией. Это связано с тем, что если length является отрицательным значением, оно интерпретируется как обратное смещение от конца parameter.

Ответ 10

Моя версия

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