Sous UNIX j'exécute:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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