Sous UNIX j'exécute:
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:
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:
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:
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 |
Partager