Como posso ecoar com espaços escapados?

Como posso ecoar com espaços escapados?

Quero fazer eco de uma variável com espaços em um arquivo de texto.

a=a\ b\ c
echo $a > /tmp/a

O resultado acima resulta em um arquivo dentro a b cdele. E se eu precisar que o arquivo seja lido a\ b\ c?

Eu tentei printf %q $a, mas isso também não parece fazer o que eu quero.

Nota: Suponha também que eu não produzo o conteúdo que $aé passado para mim fora do meu controle. Eu só preciso ter certeza de que ele foi salvo com espaços de escape.

Responder1

Barras invertidas escapam do próximo caractere; no seu caso, você escapou do espaço, ponto em que o conteúdo de $ase torna: a b c. Se você quiser que o conteúdo de $a tenha barras invertidas, você precisará escapar delas:

a=a\\\ b\\\ c

ou

a='a\ b\ c'

Se $a já contém texto com espaços e você deseja salvá-lo em um arquivo, simplesmente:

printf "%q" "$a" > /tmp/a

Quando você correu:

printf "%q" $a > /tmp/a

Você disse ao printf para citar3pedaços de texto divididos e agrupados: a, b, e c, dos quais ele obedientemente escapou (não fazendo nada) antes de ser redirecionado para /tmp/a como abc.

Faça uma boa leitura:Por que meu script de shell engasga com espaços em branco ou outros caracteres especiais?para ver o que está acontecendo.

Responder2

Basta colocá-lo entre aspas.

a="a\ b\ c"

Alternativamente, escape da fuga.

a=a\\\ b\\\ c

Ambos acabam com o mesmo resultado.

Responder3

Solução baseada no feedback de Jeff:

echo $a | sed -e "s/ /\\\ /g" > /tmp/a

informação relacionada