Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 15h10   #1
Membre du Club
 
Inscription : janvier 2007
Messages : 270
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 270
Points : 50
Points : 50
Par défaut Sed et variables

Bonjour,

J'ai un soucis, j'ai un sed à faire pour remplacer une chaine par une autre.
bon il n'y a pas de soucis de particulier sauf... que cette ligne est un path vers un fichier à rempalcer par un autre path.
je ne sais pas comment faire pour faire en sorte que la commande sed n'interprète pas les caractères du path comme des caractère spéciaux.

vous auriez une idée?
merci
danathane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h48   #2
Membre du Club
 
Inscription : janvier 2007
Messages : 270
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 270
Points : 50
Points : 50
Par défaut Sed et variables

Bonjour,

Je suis en train de bosser sur un script bash qui nécessite que je remplace certaines chaînes par d'autres dans un fichier.
Donc pour faire cela j'utilise sed, mais j'aimerai savoir comment faire pour utiliser des variables dans cette commande ?

Voilà mon script qui ne marche pas :

Code :
1
2
3
4
5
6
7
temp_dir="you pi il fe beau"
var1="you"
var2="me"
 
var_bidul=$(echo $temp_dir | sed -e 's/$var1/$var2/g')
 
echo $var_bidul
danathane est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 15h58   #3
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Code :
1
2
3
4
5
6
7
 
[francois@lpne ~] toto=abc
[francois@lpne ~] titi=a
[francois@lpne ~] tutu=d
[francois@lpne ~] echo $toto | sed 's/'$titi'/'$tutu'/'
dbc
[francois@lpne ~]
il faut dé quotter les variables dans sed. tout simplement (enfin simplement ... une fois qu'on le sait quoi...)

normalement la syntaxe :
Code :
echo $toto | sed "s/$titi/$tutu/g"
est aussi censée fonctionner.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/05/2011, 19h01   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

sans davantage de détails, je dirai :
changer le séparateur de sed par un caractère qui n'interférera pas.

pour les remplacements, ça se fait tout seul : sed 's@/mon/path@/unAutre/path@';

pour les recherches, il faut d'abord protéger le caractère choisi : sed '\@/mon/path/@'
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 17h02   #5
Membre du Club
 
Inscription : janvier 2007
Messages : 270
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 270
Points : 50
Points : 50
Ok d'accord. Alors plus compliqué : comment faire pour que le sed n'interprète bien de ce qui se trouve dans les variables comme étant un caractère spécial ou autre?
danathane est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 17h16   #6
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par danathane Voir le message
Ok d'accord. Alors plus compliqué : coment faire pour que le sed n'interprète bien de ce qui se trouve dans les variables comme étant un caractère spécial ou autre?
en respectant les regexp correspondantes à la protection des caractères spéciaux.

déjà
faire ${var} au lieu de $var
pour un texte contenant un caractère spécial par exemple le doubler \\,"\ "pour l'espace par exemple ou tout caractère "non-imprimable", \?, \$
etc...

attention aussi à bien tester le contenu de la variable avant injection dans les fichiers de sortie...ça évite les surprises (qui sont en générale mauvaises ).
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h38   #7
Membre du Club
 
Inscription : janvier 2007
Messages : 270
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 270
Points : 50
Points : 50
Alors le truc par exemple, c'est que dans un fichier, je dois changer un path par un autre, mais cela de façon dynamique, ça change tout le temps, donc je ne peux pas vraiment doubler les "\" ou mettre les "\" avant tous les caractères spéciaux.

Est-ce que vous auriez un exemple ou corriger l'erreur de mon script ? je m'acharne dessus depuis tout à l'heure sans succès

Code :
1
2
3
4
5
6
7
8
9
10
 
 
 
temp_dir="you pi/ i./*$\$l fe beau"
var1="/"
var2="me"
 
var_bidul=$(echo $temp_dir | sed s/$var1/$var2/g)
 
echo $var_bidul
danathane est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/05/2011, 17h54   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
1
2
var_bidul=$(echo $temp_dir | sed s/$var1/$var2/g)
var_bidul=$(echo $temp_dir | sed "s#$var1#$var2#g")
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/05/2011, 18h05   #9
Membre du Club
 
Inscription : janvier 2007
Messages : 270
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : janvier 2007
Messages : 270
Points : 50
Points : 50
On peut utiliser le # à la place du / pour séparer les morceau de l'expression régulière? je ne connaissais pas du tout.
danathane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 18h12   #10
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Tu peux utiliser le séparateur de ton choix. En admettant que tu n'aies pas de "A" dans ton expression :

Marchera tout aussi bien
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 18h21   #11
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
Citation:
Envoyé par danathane Voir le message
On peut utiliser le # à la place du / pour séparer les morceau de l'expression régulière? je ne connaissais pas du tout.
le premier caractère de la commande substitute de sed sert de séparateur
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h35.


 
 
 
 
Partenaires

Hébergement Web