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