Ниже приведен фрагмент сценария оболочки из более крупного сценария. Он удаляет кавычки из строки, содержащейся в переменной. Я делаю это с помощью sed, но эффективно ли это? Если нет, то каков эффективный путь?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Этот синтаксис удалит qoutes только тогда, когда есть совпадающая пара.Ответы:
Существует более простой и эффективный способ, использующий встроенную функцию удаления префикса / суффикса оболочки:
${opt%\"}
удалит суффикс"
(экранированный с обратной косой чертой для предотвращения интерпретации оболочки).${temp#\"}
удалит префикс"
(экранированный с обратной косой чертой для предотвращения интерпретации оболочки).Еще одним преимуществом является то, что он будет удалять окружающие цитаты, только если есть окружающие цитаты.
Кстати, ваше решение всегда удаляет первый и последний символ, какими бы они ни были (конечно, я уверен, что вы знаете свои данные, но всегда лучше быть уверенным в том, что вы удаляете).
Используя sed:
(Улучшенная версия, как указано в jfgagne, избавление от эха)
Таким образом, он заменяет ведущий
"
ни с чем, и трейлинг"
тоже ни с чем. В том же вызове (нет необходимости передавать и запускать другой sed. Используя-e
вы можете иметь несколько текстовых обработок).источник
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
регулярное выражение или подстановку переменной можно заключить вcase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Используйте tr для удаления
"
:Примечание . При этом удаляются все двойные кавычки, а не только начальные и конечные.
источник
Это удалит все двойные кавычки.
источник
Don't remove this \" quote
.:-(
Существует простой способ использования xargs :
xargs использует echo в качестве команды по умолчанию, если команда не указана, и удаляет кавычки из входных данных. Смотрите, например, здесь .
источник
echo '"quoted"' | xargs
->quoted
Вы можете сделать это только одним звонком
sed
:источник
Кратчайший путь - попробуйте:
Он фактически удаляет все
"
s (двойные кавычки) изopt
(действительно ли будет больше двойных кавычек, кроме как в начале и в конце, хотя? Так что это на самом деле то же самое, и намного более кратко ;-))источник
Если вы используете jq и пытаетесь удалить кавычки из результата, другие ответы будут работать, но есть лучший способ. Используя эту
-r
опцию, вы можете вывести результат без кавычек.источник
jq
но обратите внимание, что это не работает, если JQ также выводит вывод ASCII с-a
(это ошибка на стороне JQ)yq
Также есть-r
опция:yq -r '.foo' file.yml
Обновить
Простой и элегантный ответ из Разбор одинарных и двойных кавычек в строке с использованием только команд bash / standard Linux :
BAR=$(eval echo $BAR)
полоски цитаты изBAR
.================================================== ===========
Основываясь на ответе Хуэйбуа, после многих проб и ошибок я придумал эту функцию:
Если вы не хотите ничего распечатывать, вы можете передать
/dev/null 2>&1
.Использование:
источник
Самое простое решение в Bash:
Это называется раскрытием подстроки (см. Руководство по Gnu Bash и поиск
${parameter:offset:length}
). В этом примере она берет подстрокуs
начиная с позиции 1 и заканчивая второй последней позицией. Это связано с тем, что еслиlength
это отрицательное значение, оно интерпретируется как обратное смещение от концаparameter
.источник
Это самый дискретный способ без использования sed:
Или
Вывод:
Я получил это из источника .
источник
Есть еще один способ сделать это. Подобно:
источник
Моя версия
Функция принимает имена переменных и удаляет кавычки. Он удаляет только совпадающую пару ведущих и конечных кавычек. Он не проверяет, экранирует ли конечная кавычка (предшествует
\
сам экранирование).По моему опыту, такие строковые служебные функции общего назначения, как эта (у меня есть их библиотека), наиболее эффективны при непосредственном манипулировании строками, без использования какого-либо сопоставления с образцом и, особенно, при создании каких-либо вложенных оболочек или при вызове каких-либо внешних инструментов, таких как
sed
,awk
илиgrep
.источник
Я знаю, что это очень старый вопрос, но вот еще один вариант sed, который может кому-то пригодиться. В отличие от некоторых других, он заменяет только двойные кавычки в начале или в конце ...
источник