Como posso adicionar uma barra invertida antes de todos os espaços?

5

Como posso colocar uma barra invertida antes de cada espaço, de preferência usando os comandos tr ou sed ?

Aqui está o meu script:

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\ "

Supõe-se que substitua espaços por uma barra invertida seguida por um espaço, mas apenas substitui os espaços por uma barra invertida e não por um retrocesso + espaço.

Esta é a saída que recebo:

hello\bye

Resultado esperado:

hello\ bye
    
por daka 14.03.2015 / 18:52

2 respostas

11

tr não pode fazer vários caracteres. Use um destes em vez disso:

  1. sed

    echo "$line" | sed 's/ /\ /g' 
    

    ou

    sed 's/ /\ /g' <<< "$line"
    
  2. Perl

    echo "$line" | perl -pe 's/ /\ /g'  
    

    ou

    perl -pe 's/ /\ /g'<<< "$line"
    

    O Perl também possui uma função bacana chamada quotemeta , que pode escapar de todas as coisas estranhas em uma string:

    line='@!#$%^&*() _+"'
    perl -ne 'print quotemeta($_)' <<< $line
    

    O texto acima será impresso

    \@\!\#$\%\^\&\*\(\)\ _\+\"\
    
  3. Você também pode usar printf e %q :

    %q  quote the argument in a way that can be reused as shell input
    

    Então, você poderia fazer

    echo "$line" | printf "%q\n" 
    

    Note que isso, como o quotemeta do Perl, irá escapar todos caracteres especiais, não apenas espaços.

    printf "%q\n" <<<$line
    
  4. Se você tem a linha em uma variável, você pode fazer isso diretamente no bash:

    echo ${line// /\ }
    
por terdon 14.03.2015 / 19:45
2

AWK ausente na lista de todas as soluções possíveis:)

$ echo "Hello World" | awk '{gsub(/ /,"\ ");print}'                                                                             
Hello\ World
    
por Sergiy Kolodyazhnyy 07.01.2016 / 13:13