Como posso ecoar com espaços de escape?

0

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

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

Os resultados acima resultam em um arquivo com a b c . E se eu precisar que o arquivo leia 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 produza o conteúdo de $a que é passado para mim fora do meu controle. Eu só preciso ter certeza de que é salvo com espaços de escape.

    
por Philip Kirkbride 21.11.2017 / 16:52

3 respostas

3

As barras invertidas escapam do próximo caractere; no seu caso, você escapou do espaço, quando o conteúdo de $a se tornou: a b c . Se você quer que o conteúdo de $ a tenha barras invertidas, então você precisa escapar:

a=a\\ b\\ c

ou

a='a\ b\ c'

Se $ a já contiver texto com espaços e você quiser salvá-lo em um arquivo, simplesmente:

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

Quando você executou:

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

Você disse ao printf para citar 3 split & pedaços de texto globbed: a , b e c , que ele escapou obedientemente (sem fazer nada) antes de ser redirecionado para / tmp / a como abc .

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

    
por 21.11.2017 / 17:00
1

Basta colocar entre aspas.

a="a\ b\ c"

Alternativamente, escape da fuga.

a=a\\ b\\ c

Ambos acabam com o mesmo resultado.

    
por 21.11.2017 / 16:58
0

Solução baseada no feedback de Jeff:

echo $a | sed -e "s/ /\\ /g" > /tmp/a
    
por 21.11.2017 / 17:24