Shell script-удаляет первую и последнюю кавычки ( " ) из переменной

Shell script-удаляет первую и последнюю кавычки ( " ) из переменной

16.03.2012 11:14:36 Просмотров 19 Источник

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

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable#comment80327496_9733338
@JohnSmith я также должен автоматически экранировать кавычки в скрипте оболочки, но мне нужно сделать это независимо от того, совпадают они или нет, поэтому я, вероятно, не буду использовать это выражение, которое вы опубликовали.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable#comment98869313_9733338
Если вы нашли этот вопрос, просто желая удалить все кавычки, смотрите этот ответ: askubuntu.com/a/979964/103498 .

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

Some programmer dude

16.03.2012 11:21:08

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

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
Является ответом!
huelbois

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вы можете иметь многократную обработку текста).

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment12404075_9733456
Вы можете избавиться от трубы в растворе sed с sed -e 's/^"//' -e 's/"$//' <<< $opt.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment60816759_9733456
Это может привести к неправильному поведению строки, в которой нет ни ведущего, ни заключительного символа кавычки. Есть какие-нибудь предложения, как обращаться с этим изящно?
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment60816930_9733456
Чтобы обработать только совпадающие внешние кавычки, смотрите ответ @Joachim Pileborg
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment67105994_9733456
@jsears а? Это особенно урезает один с самого начала, если он есть, и один с конца, если он есть. Если вы не хотите удалять, если оба не присутствуют; да, sed
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment67109858_9733456
@tripleee : в моей версии bash (4.3-14) цитирование $opt ничего не меняет на "<< Даже если opt содержит пробелы или "*", он не расширяется. Хотя не уверен, что так было всегда.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment67109928_9733456
Расширяется на OSX Yosemite (10.10); Bash 3.2.57(1).
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment80589084_9733456
Вы можете избежать множественных выражений, используя sed 's/^"\|"$//g'
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment82329368_9733456
Потрясающий... теперь вы можете сделать что-то вроде этого $REPLACEME=$(sed -e 's/^"//' -e 's/"$//' <<<"$REPLACEME"), так что вы можете иметь рабочую переменную.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment103888016_9733456
@tzrlk вам не нужны скобки, если вы хотите использовать или в выражении так: sed-E 's/(^")|("$)//g')
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733456#comment105413993_9733456
Вы можете объединить несколько выражений sed с точкой с запятой, как это echo '"foo"' | sed 's/^"//;s/"$//'
Dr.Kameleon

16.03.2012 11:29:39

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

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

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

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733475#comment12377177_9733475
Если вы хотите удалить все двойные кавычки, то еще лучше использовать : "${opt//\"/}". Ни трубы, ни раковины... И будьте осторожны, если у вас есть пробелы в opt, вы можете потерять их. Всегда цитируйте переменные типа: echo " $opt"
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/9733475#comment12378211_9733475
Ну, переменная в основном считывает путь DocumentRoot из конфигурационного файла httpd, поэтому я не думаю, что может быть случай, когда в строке может быть символ цитаты. И этот СЭД гораздо аккуратнее и эффективнее.... Спасибо!
Steven Penny

08.06.2012 10:11:33

Это позволит удалить все двойные кавычки.

echo "${opt//\"}"
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/10943857#comment19408771_10943857
Но будет разрываться с экранированными кавычками, например, Don't remove this \" quote :-(
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/10943857#comment67105873_10943857
Это расширение Bash, поэтому оно не применимо к сценарию оболочки в целом. (Вопрос о том, важно это или нет, неоднозначен. Посетители, которые находят это в Google, возможно, ищут решение POSIX.)
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/10943857#comment95554332_10943857
Совершенство! Именно то, что мне было нужно. Я люблю такие вопросы, которые дают вам множество ответов, а не только то, что просил ОП. Драгоценные камни находятся в неприемлемых ответах!
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/10943857#comment99388964_10943857
Я боюсь, что OP хочет что-то, что удаляет только лидирующие/трейлинговые котировки и сохраняет экранированные.
wieczorek1990

11.10.2014 04:52:23

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

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

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

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/26314887#comment56650530_26314887
Это не то, что просил OP, поскольку он также удаляет все котировки, а не только ведущие и конечные.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/26314887#comment71811399_26314887
Хотя я не отвечаю на OP явно, это решает для меня, потому что есть только двойные кавычки в начале и конце "/path/file-name". Здесь нет встроенных двойных кавычек. +1
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/26314887#comment89053394_26314887
Это решение будет тем, чего хотят многие люди. Во многих случаях сценарии могут легко получить работоспособные данные вплоть до строки, окруженной кавычками.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/26314887#comment93718866_26314887
Элегантный и спас меня от гораздо большего времени проб и ошибок отладки. Тнх.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/26314887#comment103959211_26314887
Это то, чего в идеале хочется, и именно поэтому у него больше голосов, чем у принятого ответа.
nimig18

15.01.2016 11:24:44

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

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

Или

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

Выход:

   quotes: "fish"
no quotes:  fish

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

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/34819300#comment60816862_34819300
Это приведет к удалению кавычек из строки, а также тех, которые ее окружают.
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/34819300#comment67106049_34819300
Помимо комментария, это идентично ответу @StevenPenny от 2012 года .
Gene Pavlovsky

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
Jonathan Lin

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
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/46115001#comment81225100_46115001
Хотя мне очень нравятся простые и элегантные, я думаю, стоит отметить, что eval не делает просто обрезки двойной кавычки, а фактически оценивает как строку кода. Поэтому данная методика может привести к непредвиденным результатам, когда панель содержит другие последовательности, которые могут заменять оболочкой (например, бар=\'\ АВС' или бар=АБ\'C или бар=\$B, или бар=\$(общ. *) )
user1587520

09.07.2018 12:51:12

Есть простой способ использовать xargs:

> echo '"quoted"' | xargs
quoted

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

https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/51242645#comment91212896_51242645
echo '"quoted"' | xargs --> quoted
https://stackoverflow.com/questions/9733338/shell-script-remove-first-and-last-quote-from-a-variable/51242645#comment92600759_51242645
Это работает, но только для четного числа кавычек в строке. Если есть нечетное число, оно порождает ошибку.
Hiro.Protagonist

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.

DevilTour

19.11.2019 09:21:46

Есть и другой способ сделать это. Нравится:

echo ${opt:1:-1}
killjoy

06.02.2020 11:37:22

Если вы используете jq и пытаетесь удалить кавычки из результата, другие ответы будут работать, но есть лучший способ. Используя опцию-r, вы можете вывести результат без кавычек.

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar
Закрыть X