Предполагая, что $file
он содержит значение имени файла, скажем Dr' A.tif
. В программировании на Bash, как я могу избежать одиночной кавычки и любого другого специального символа $file
без удаления специального символа?
Обновление от 9 июля 2014 г.
По запросу @Gilles , следующий фрагмент кода, который не может обработать Dr' A.tif
:
files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}
После того, как я опробовал в ответ от @Patrick на line 1
, кажется, работает для меня. Но если у меня есть файл, такой как Dr\^s A.tif
, printf
команда, кажется, не помогает, она показывает мне Dr\^s\ A.tif
. Если я вручную попробую это на консоли, как это:
printf "%q" "Dr\^s A.tif"
У меня будет такой вывод:
Dr\\\^s\ A.tif
Есть идеи, как с этим справиться?
Ответы:
Вы можете использовать
printf
встроенную функцию%q
для этого. Например:Из документации bash
printf
:источник
printf '%s' "foo"
. Вы должны сначала понять, как работает синтаксический анализ в оболочке. См. Gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 до того, как # 6.printf
без каких-либо других манипуляцийIt doesn't have a: ""
printf
. Ваша проблема в том, что вы не хотите, чтобы оболочка анализировала вашу строку. Чтобы сделать это, вы должны передать свой ввод в оболочку так, чтобы он даже не пытался ее проанализировать. Один из способов сделать это -read -r -p 'input: ' && printf '%q\n' "$REPLY"
предоставить данные при появлении запроса.printf
. Возможно, вам следует задать вопрос, а не критиковать решение, которое не имеет ничего общего с вашей проблемой.Пытаться:-
или
или если строка содержит двойные кавычки: -
Есть хорошие учебники по выходу и цитированию в сети. Начни с этого .
источник
Вам не нужно экранировать имена файлов, которые вы обрабатываете в скрипте. Экранирование необходимо только в том случае, если вы хотите поместить имя файла в качестве литерала в сценарии или передать несколько имен файлов в виде одного входного потока в другой сценарий.
Поскольку вы перебираете выходные данные
find
, это один из самых простых способов (!) Для обработки всех возможных путей :источник
быстро и (очень) грязно
источник
Многие из этих ответов, в том числе пользующиеся наибольшим количеством голосов, не
printf "%q"
будут работать во всех случаях без дополнительных манипуляций. Я хотел бы предложить следующее (пример ниже):cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF
источник