2010-05-18 3 views
58

J'ai besoin d'une commande bash qui va convertir une chaîne en quelque chose qui est échappé. Voici un exemple:Commande d'échappement d'une chaîne dans bash

 
echo "hello\world"|escape|someprog 

Lorsque la commande escape fait passer "hello \ world" dans "hello \\ world". Ensuite, someprog peut utiliser "hello \ world" comme prévu. Bien sûr, c'est un exemple simplifié de ce que je vais vraiment faire.

+5

Quelle est la nature de l'évasion? En d'autres termes, quels personnages doivent être échappés? Cherchez-vous une échappée de style C++ (où les tabulations sont remplacées par \ t, les sauts de ligne avec \ n, les guillemets avec \ ", etc.) Il est difficile d'aider sans que le problème soit bien défini –

+2

echo que shell-échappe arguments] (http://stackoverflow.com/questions/2731883/echo-that-shell-escapes-arguments) –

Répondre

102

Dans Bash:

printf "%q" "hello\world" | someprog 

par exemple:

printf "%q" "hello\world" 
hello\\world 

Cela pourrait être utilisé par des variables aussi:

printf -v var "%q\n" "hello\world" 
echo "$var" 
hello\\world 
+4

Rappelez-vous, '% q' a été brisé pendant plus d'une décennie jusqu'à environ 2012. Il a eu des problèmes avec' ~ '. Il y a aussi des sed-one portatives http://stackoverflow.com/a/20053121/1073695 –

+1

sed est en effet mieux car elle permet aussi d'échapper aux signes dollar – untore

+1

@untore: 'a = 'abc $ def': '; printf'% q \ n '"$ a" 'donne' abc \ $ def \ ":' (le signe dollar est échappé). C'est Bash 4.3 (j'ai obtenu le même résultat dans Bash 3.2). Quelle version utilisez-vous? –

1

Vous pouvez utiliser Perl pour remplacer différents caractères, par exemple:

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

En fonction de la nature de votre évasion, vous pouvez enchaîner plusieurs appels pour échapper aux caractères appropriés.

+1

Pourquoi pas sed? $ echo "bonjour \ monde" | sed 's/\\/\\\\/' – Space

+1

@Octopus, c'est aussi une option valide.J'arrive à être plus à l'aise avec perl, mais oui, cela fonctionne aussi –

5

Bash pur, utilisez la substitution de paramètres:

string="Hello\ world" 
echo ${string//\\/\\\\} | someprog 
+2

Vous voulez en savoir plus? Http: //wiki.bash-hackers. org/syntax/pe # search_and_replace –

+1

De cette façon, "hello world" n'est pas échappé à "hello \ world" - printf approche dans la réponse acceptée – vchrizz

+1

Aussi, "% q" n'échappe pas à '/' comme dans "03/25/2017 "dont j'avais besoin pour être échappé à" 03 \/25 \/2017 "(de sorte qu'il pourrait être dans une expression régulière '/' délimitée) – wrlee