Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications
Applications Questions sur l'utilisation d'applications, du shell, et des interfaces graphiques (KDE, Gnome, XFCE... )
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 27/09/2011, 20h47   #1
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Par défaut Sed : Remplacement de chaines par d'autres avec des caractères spéciaux

Bonjour A tous
[Env Bash ou ksh]

J'ai le fichier de paramétrage de remplacement de chaîne suivant
codé comme suit
[Tag] 1Espace chaine_de_remplacement_avec_car_speciaux
Exemple : fichier param
Code :
1
2
3
[Value1] texte1&OK?iciLe\OK:#OK
[Value2] KO
[Value3] &&&../\:!OK
Et le fichier de donnée : data
Code :
1
2
3
Value 1 a comme Valeur ([Value1])
Value 2 a comme Valeur ([Value2])
Value 3 a comme Valeur ([Value3])
Je veux faire un script change.sh qui prend en parametre param et data
et me donne le fichier out suivant
change.sh param data > out
Code :
1
2
3
Value 1 a comme Valeur (texte1&OK?iciLe\OK:#OK)
Value 2 a comme Valeur (KO)
Value 3 a comme Valeur (&&&../\:!OK)

mon problème c'est la gestion des caractères spéciaux avec sed : y t'il possibilité de les ignorer ? ou alors de les gérér ?

Merci de votre aide
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 08h42   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
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 538
Points : 7 754
Points : 7 754
Code :
1
2
3
4
5
6
7
8
9
10
[fpu@lne ~/tmp] while read ligne; do  sed "s/./$ligne&/" q; done < a           Value 1 a comme Valeur ([Value1])[Value1] texte1&OK?iciLe\OK:#OK
Value 1 a comme Valeur ([Value1])[Value2] KO
Value 1 a comme Valeur ([Value1])[Value3] &&&../\:!OK
Value 2 a comme Valeur ([Value2])[Value1] texte1&OK?iciLe\OK:#OK
Value 2 a comme Valeur ([Value2])[Value2] KO
Value 2 a comme Valeur ([Value2])[Value3] &&&../\:!OK
Value 3 a comme Valeur ([Value3])[Value1] texte1&OK?iciLe\OK:#OK
Value 3 a comme Valeur ([Value3])[Value2] KO
Value 3 a comme Valeur ([Value3])[Value3] &&&../\:!OK
[fpu@lne ~/tmp]
debut de piste je te laisse chercher...

tu n'as plus qu'a remplacer par du ligne à ligne et enfin à virer [valueX]
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 09h43   #3
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,

Une autre approche avec la commande "join", mais ça nécessite une petit changement dans le fichier "data", en gros un espace après la parenthèse ouvrante et un avant la parenthèse fermante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat param 
[Value1] texte1&OK?iciLe\OK:#OK
[Value2] KO
[Value3] &&&../\:!OK
 
$ cat data 
Value 1 a comme Valeur ( [Value1] )
Value 2 a comme Valeur ( [Value2] )
Value 3 a comme Valeur ( [Value3] )
 
$ join -1 1 -2 7 -o 2.1,2.2,2.3,2.4,2.5,2.6,1.2,2.8  param data 
Value 1 a comme Valeur ( texte1&OK?iciLe\OK:#OK )
Value 2 a comme Valeur ( KO )
Value 3 a comme Valeur ( &&&../\:!OK )
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/09/2011, 12h12   #4
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 535
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 535
Points : 461
Points : 461
Citation:
Envoyé par zipe31 Voir le message
Salut,

Une autre approche avec la commande "join", mais ça nécessite une petit changement dans le fichier "data", en gros un espace après la parenthèse ouvrante et un avant la parenthèse fermante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat param 
[Value1] texte1&OK?iciLe\OK:#OK
[Value2] KO
[Value3] &&&../\:!OK
 
$ cat data 
Value 1 a comme Valeur ( [Value1] )
Value 2 a comme Valeur ( [Value2] )
Value 3 a comme Valeur ( [Value3] )
 
$ join -1 1 -2 7 -o 2.1,2.2,2.3,2.4,2.5,2.6,1.2,2.8  param data 
Value 1 a comme Valeur ( texte1&OK?iciLe\OK:#OK )
Value 2 a comme Valeur ( KO )
Value 3 a comme Valeur ( &&&../\:!OK )
$
Merci zip31 pour cette réponse mais c'est mon exemple qui est trop simple
Le fichier de data peut etre comme suit : (Du coup join ne va pas)
Code :
1
2
3
[Value2] est le contenu de Value 2
Value 1 a comme Valeur ( [Value1] )
Ici nous avons [Value3] Pour Value 3
et le résultat attendue serait :
Code :
1
2
3
KO est le contenu de Value 2
Value 1 a comme Valeur ( texte1&OK?iciLe\OK:#OK )
Ici nous avons &&&../\:!OK Pour Value 3
__________________
Signé : Capitaine Jean-Luc Picard
argoet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 12h50   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Code :
1
2
3
4
regex="texte1&OK?iciLe\OK:#OK"
printf -v regex '%q' "$regex"
echo "$regex"
texte1\&OK\?iciLe\\OK:#OK
Citation:
Envoyé par help printf
%q quote the argument in a way that can be reused as shell input
par contre ça ne protégera pas la barre oblique /
il faudra donc changer le séparateur de sed par un caractère qui n'est pas présent dans le fichier param
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h02.


 
 
 
 
Partenaires

Hébergement Web