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 ele substitua espaços por uma barra invertida seguida por um espaço, mas substitui apenas os espaços por uma barra invertida e não por uma barra invertida + espaço.
Esta é a saída que recebo:
hello\bye
Saída esperada:
hello\ bye
tr x ' '
, ondex
está o personagem que você deseja substituir?Respostas:
tr
não pode fazer vários caracteres. Use um destes:sed
ou
Perl
ou
O Perl também tem uma função bacana chamada
quotemeta
que pode escapar de todas as coisas estranhas em uma string:O acima será impresso
Você também pode usar
printf
e%q
:Então, você poderia fazer
Observe que isso, como o Perl,
quotemeta
escapará a todos os caracteres especiais, não apenas aos espaços.Se você tem a linha em uma variável, basta fazê-lo diretamente no bash:
fonte
printf
built-in do Bash tem funcionalidade semelhante aquotemeta
-printf '%q\n' "$line"
deve fazê-lo IIRC.Não está
AWK
faltando na lista de todas as soluções possíveis :)fonte