
Я хочу вывести переменную с пробелами в текстовый файл.
a=a\ b\ c
echo $a > /tmp/a
Результатом выше является файл с a b c
внутри. Что делать, если мне нужно прочитать файл a\ b\ c
?
Я пробовал printf %q $a
, но это тоже не дает того, чего я хочу.
Примечание: Также предположим, что я не создаю его содержимое, $a
которое передается мне вне моего контроля. Мне просто нужно убедиться, что оно сохранено с экранированными пробелами.
решение1
Обратные косые черты экранируют следующий символ; в вашем случае вы экранировали пробел, после чего содержимое $a
становится: a b c
. Если вы хотите, чтобы содержимое $a имело обратные косые черты, вам нужно экранировать их:
a=a\\\ b\\\ c
или
a='a\ b\ c'
Если $a уже содержит текст с пробелами и вы хотите сохранить его в файл, просто:
printf "%q" "$a" > /tmp/a
Когда вы бежали:
printf "%q" $a > /tmp/a
Вы сказали printf цитировать3разделенные и объединенные фрагменты текста: a
, b
, и c
, которые он добросовестно экранировал (ничего не делая) перед тем, как был перенаправлен в /tmp/a как abc
.
Внимательно прочтите:Почему мой скрипт оболочки тормозит пробелы и другие специальные символы?чтобы увидеть, что происходит.
решение2
Просто заключите это в кавычки.
a="a\ b\ c"
В качестве альтернативы, побег из побега.
a=a\\\ b\\\ c
Оба варианта заканчиваются одинаковым результатом.
решение3
Решение основано на отзыве Джеффа:
echo $a | sed -e "s/ /\\\ /g" > /tmp/a