311 votes

sed script - environnement variable de substitution

J'ai sed liés à la question:

Si je lance cette commande à partir d'un script:

#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla

Ce qui est bien.

Mais, si je lance:

#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'

J'ai lu des tutoriels que de substituer env. les variables du shell, vous devez arrêter de, et de la 'citation' $varname partie de sorte qu'il n'est pas substitué directement, ce qui est ce que j'ai fait, et ce qui ne fonctionne que si la variable est définie immédiatement avant.

Comment puis-je obtenir sed à reconnaître un $var comme un env. variable, telle qu'elle est définie dans le shell ?

442voto

Norman Ramsey Points 115730

Vos deux exemples semblent identiques, ce qui rend les problèmes difficiles à diagnostiquer. Problèmes potentiels:

  1. Vous pouvez avoir besoin de guillemets doubles, comme en sed 's/xxx/'"$PWD"'/'

  2. $PWD peut contenir une barre oblique, dans ce cas vous avez besoin de trouver un personnage pas contenue dans $PWD à utiliser comme un délimiteur.

200voto

Jeach Points 1753

En plus de Norman Ramsey réponse, je tiens à ajouter que vous pouvez double-citer l'ensemble de la chaîne (ce qui peut rendre l'énoncé plus lisible et moins sujette aux erreurs).

Donc, si vous voulez la recherche pour " foo " et le remplacer par le contenu de $BAR, vous pouvez placer la commande sed dans les doubles guillemets.

sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"

Dans la première, $BAR ne se développe pas correctement alors que dans le second $BARRE de développer correctement.

93voto

Thales Ceolin Points 115

Une autre alternative simple:

Puisque $PWD contiennent généralement une barre oblique "/", " | " au lieu de "/" pour la sed déclaration:

sed -e "s|xxx|$PWD|"

68voto

Paulo Fidalgo Points 5207

Vous pouvez utiliser d'autres caractères en plus de "/" dans la substitution:

sed "s#$1#$2#g" -i FILE

17voto

Eddie Points 27755

Avec votre question de modifier, je vois votre problème. Disons que le répertoire courant est - /home/yourname ... dans ce cas, votre commande ci-dessous:

sed 's/xxx/'$PWD'/'

sera étendu à d'

sed `s/xxx//home/yourname//

ce qui n'est pas valide. Vous avez besoin de mettre un \ personnage en face de chaque / de votre $PWD si vous voulez le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X