Shell Script - удалить первую и последнюю кавычку (") из переменной - PullRequest
172 голосов
/ 16 марта 2012

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

#!/bin/sh

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

Ответы [ 10 ]

213 голосов
/ 11 октября 2014

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

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

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

198 голосов
/ 16 марта 2012

Существует более простая и эффективная функция с использованием встроенной функции удаления префикса / суффикса оболочки:

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

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

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

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

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

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

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

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

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

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

29 голосов
/ 08 июня 2012

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

echo "${opt//\"}"
18 голосов
/ 09 июля 2018

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

> echo '"quoted"' | xargs
quoted

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

17 голосов
/ 16 марта 2012

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

$ echo "\"html\\test\\\"" | sed 's/^"\(.*\)"$/\1/'
html\test\
15 голосов
/ 16 марта 2012

Кратчайший путь - попробуйте:

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

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

8 голосов
/ 08 сентября 2017

Обновление

Простой и элегантный ответ от https://stackoverflow.com/a/24358387/1161743:

BAR=$(eval echo $BAR) отрывки цитат из BAR.

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

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

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

Если вы не хотите ничего распечатывать, выможет направить уловок к /dev/null 2>&1.

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

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR
6 голосов
/ 15 января 2016

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

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

ИЛИ

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

вывод:

   quotes: "fish"
no quotes:  fish

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

0 голосов
/ 04 июня 2019

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

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc
0 голосов
/ 12 июля 2017

Моя версия

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...