Как сделать эхо с экранированными пробелами?

Как сделать эхо с экранированными пробелами?

Я хочу вывести переменную с пробелами в текстовый файл.

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

Связанный контент