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 29/12/2007, 20h52   #1
Membre du Club
 
Inscription : janvier 2007
Messages : 67
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 67
Points : 43
Points : 43
Par défaut sed et regexp avec variables

Sous UNIX j'exécute:
Code :
1
2
3
>ligne="blabla <U>upper(P23)</U> blabla"
>echo "$ligne" | sed "s|<U>\(.*\)P23\(.*\)</U>|\1'TOTO'\2|g"
blabla upper('TOTO') blabla
(je remplace le paramètre P23 de la ligne avec sa valeur 'TOTO')
Résultat corect.

Problème: si la ligne contient 2 paramètres, ça ne marche plus: j'obtiens:
Code :
1
2
3
>ligne="blabla <U>upper(P23)</U> blabla <U>lower(P24)</U> blabla"
>echo "$ligne" | sed "s|<U>\(.*\)P23\(.*\)</U>|\1'TOTO'\2|g"
blabla upper('TOTO')</U> blabla <U>lower(P24) blabla
à la place de:
Code :
blabla upper('TOTO') blabla <U>lower(P24)</U> blabla
J'ai compris pourquoi, ç'est qu'il prend comme variable \2 tout ce qu'il y a entre P23 et le dernier </U>, et pas entre P23 et le </U> suivant comme j'aurais aimé.

Quelle est la solution, si elle existe...?

OBS.1: Je ne peux pas changer les valeurs des lignes.
OBS.2: Je ne peux pas simplifier et faire par exemple "s|P23|'TOTO'|g" car il y a des situations plus complexes par exemple si la valeur de P23 est en faite une liste 'TOTO TATA' alors je veux faire:
Code :
1
2
3
>ligne="blabla <U>upper(P23)</U> blabla"
>echo "$ligne" | sed "s|<U>\(.*\)P23\(.*\)</U>|\1'TOTO'\2,\1'TATA'\2|g"
blabla upper('TOTO'),upper('TATA') blabla
vpovpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h55.


 
 
 
 
Partenaires

Hébergement Web