2009-09-29 6 views
2

Je veux échapper certains caractères spéciaux à l'intérieur d'une chaîne automatiquement. J'ai pensé faire écho à cette ficelle et l'enfiler à travers quelques seds. Cela ne semble pas fonctionner à l'intérieur des backticks. Alors, pourquoishell: Utiliser sed dans les guillemets

echo "foo[bar]" | sed 's/\[/\\[/g' 

retour

foo\[bar] 

mais

FOO=`echo "foo[bar]" | sed 's/\[/\\[/g'` && echo $FOO 

retourne juste

foo[bar] 

?

Contrairement à sed, tr fonctionne parfaitement à l'intérieur du contre-apostrophes:

FOO=`echo "foo[bar]" | tr '[' '-' ` && echo $FOO 

retours

foo-bar] 

Répondre

6

Vous devez échapper les barres obliques inverses entre les backticks.

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO 

Vous pouvez également utiliser $() (ce qui est la méthode recommandée).

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO 
+0

Merci à tous! –

15

Que diriez-vous de ne pas utiliser, mais utiliser $ contre-apostrophes()?

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO 

si vous insistez sur l'utilisation des accents graves, je pense que vous avez besoin d'évasion supplémentaire tous les \ en deux \

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO 
+4

+1 pour '$()' Jamais, jamais utiliser des accents graves. Il y a tellement d'avantages à utiliser '$()'. http://mywiki.wooledge.org/BashFAQ/082 –

+2

et +1 pour le commentaire se référant à Bash FAQ 82 – nos

2

Habituellement, il est un cas de underescaping

FOO=`echo "foo[bar]" | sed 's/\[/\\\[/g'` && echo $FOO 
Questions connexes