Bonjour à tous et à toutes,

Dans une expression régulière en utilisant sed, j'ai le problème suivant :
echo "<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>
<ap:description>Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique; dit</ap:description>" | sed "s|[</ap:description>]*$||"
En fait voici ce que je récupère suite à cette expression régulière. j'ai du mal à interprétrer une fin de ligne.
<ap:description>Rotonde édifiée sur le belvédère de jardin.
<ap:description>Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique;
Alors que j'aurai voulu supprimer le premier élément </ap:description> suivi du deuxième élément
<ap:description>
Merci d'avance.
Sophonie.
Si l'on parle d'expression régulière, il faut (malheureusement !) préciser que quel type d'E.R. ou de quel outil .
Si l'on parle de retour chariot «\r»on ne parle pas de retour à la ligne «\n» et inversement (sauf chez micro$oft ou c'est l'ensemble «\r\n»).

En perl le retour chariot est défini par un «\r» .
En perl le passage à la ligne suivante est défini par «\n» mais il ne faut pas l'utiliser dans un traitement ligne par ligne (ou le «\n» est traité cmme séparateur de ligne) mais un traitement global.
le problème que tu vas avoir est que si tu retires </ap:description>{\r\n}<ap:description> tu auras ce que tu veux, mais je suppose que tu as plusieur entrée comme ça dans ton fichier xml et tu risques de te retrouver avec tout le fichier dans une seule balise...

Je pense qu'à un moment où un autre il va te falloir scripter un peu plus que ce que sed te permet de faire
Bonjour pmarion,

Il s'agit de BRE(Basic Regular Expression) et non de ERE, par exemple si je veux un retour à la ligne
entre 2 éléments XML tel quel :
<ap:typologieObjet>Batiment</ap:typologieObjet>
<ap:typologieObjet>Edifice</ap:typologieObjet>
En utilisant cette expression régulière, donc comment définir un retour à la ligne?
 echo "<ap:typologieObjet>Batiment Edifice</ap:typologieObjet>" | sed "s|<ap:typologieObjet>Batiment Edifice</ap:typologieObjet>|<ap:typologieObjet>Batiment</ap:typologieObjet><ap:typologieObjet>Edifice</ap:typologieObjet>|
j'obtient ceci
<ap:typologieObjet>Batiment</ap:typologieObjet><ap:typologieObjet>Edifice</ap:typologieObjet>
Qu'appelles-tu retour à la ligne ?
\n 0x0a::= Nouvelle ligne (LF line Feed)
\r 0x0d ::= Retour chariot (CR Carriage Return)
\r\n 0x0d0a ::= Passage à la ligne dans des fichiers Micro$oft.

sed fait (par défaut) un traitement ligne par ligne et traite les «\n» à part à cause de son traitement ligne par ligne .

Retour chariot (comme dans ton titre) n'est pas un passage à la ligne suivante mais un retour en début de ligne (sans changement de ligne).
 echo "<ap:typologieObjet>Batiment Edifice</ap:typologieObjet>" | sed "s|<ap:typologieObjet>Batiment Edifice</ap:typologieObjet>|<ap:typologieObjet>Batiment</ap:typologieObjet>\n<ap:typologieObjet>Edifice</ap:typologieObjet>|"
pmarion,

Je change l'intitulé de mon post initial.

En fait, la réponse de pingou stipule bien qu'il s'agit d'une fin de ligne \n et non d'un retour chariot \r.
Par contre c'est dans la partie de substitution que le \n est interprétré, néanmoins comment l'implémenter dans une expression régulière en tant que motif?

Merci encore.
ne vaudrait-il pas mieux utiliser les techniques spécifiques à XML pour régler ce problème?
Voici un traitement de sed sur du multi-ligne et c'est là que l'on voit qu'il n'est pas très aisé de faire du multi-lignes avec sed :
(echo a;echo x;echo y) | sed '/x$/ {
> N
> s:x\n:x:
> }'
donne comme résultat :
a
xy

le «\n» entre x et y a bien été supprimé.

Mais là on fait presque du script et l'on pert un peu l'avantage de sed qui est plutôt orienté au départ en mode commande.

Une lecture globale (et non pas multiligne) d'un fichier avec perl est plus facile (s'il y a un langage utilisant à fond les E.R. c'est bien perl).
Dans l'expression rég. suivante, le caractère fin de ligne \n n'est pas pris en compte.
echo "<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>
<ap:description>Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique; dit</ap:description>" | sed "s|\(</ap:description>\)$\n||"
Sophonie.
Tu veux vraiment pas utiliser autre chose que sed ???
Si je voudrai pingou, mais quel outil utiliser?
Ne devrai-ja pas plutôt utiliser awk pour ce genre de manip?

Aiguilles-moi, je n'en suis qu'à mes premiers balbutiements.

Sophonie.
ne vaudrait-il pas mieux utiliser les techniques spécifiques à XML pour régler ce problème? xmlsh pourrait peut-être être la solution documentation ici
Tu as le choix. Je t'ai déjà parler de xsl, mais tu pourrais juste parser ton xml en perl/java/python/xmlsh (comme cité au-dessus mais je ne connais pas)
Je suis très à l'aise avec le langage XSLT, mais je ne voulais pas concevoir une feuille de style de transformation uniquement pour une modification "infime".

En outre, je me disait que les commandes Unix permettant de s'en sortir plus souplement.
Par contre, je ne m'investirait pas dans xmlsh, je prèfère continuer l'apprentissage du Python,
et de sa bibliothèque pour parser du XML, et utiliser XSLT.

Merci quand même.
Sophonie.
Si je voudrai pingou, mais quel outil utiliser?
Mais pour utiliser des E.R., la voie royale est le langage Perl qui a toujours été le moteur des améliroations des E.R. et est donc la référence des E.R.

Si l'on doit utiliser une commande awk, sed, grep, ... pour des usages particuliers, perl les remplace TOUS.
Sans contexte, Perl est le langage de prédilection pour manipuler les chaînes de caractères donc les expressions régulières.
Mais l'apprentissage de Perl est indigeste. D'ailleurs le manuel du Perliste en témoigne.

Sophonie.
Mais l'apprentissage de Perl est indigeste. D'ailleurs le manuel du Perliste en témoigne.
Un langage complet n'est pas forcément un langage complexe, perl en est la preuve .
A toi de faire le premier pas, et tu verras.

sed a ses limites
awk a ses limites
perl n'a que tes propres limites.

Linux est complexe
Fedora est complexe
Le shell est complexe
perl est complexe
....
tout cela est une question de point de vue et d'apprentissage.

Poste un exemple de fichier à modifier et je verrais si je peux te poster une solution toute faite ,mais ce serait sauter le premier pas.
pmarion,

Modifie-moi cette chaîne de caractère afin qu'il n'y ait plus q'une seule balise <ap:description> et une
seule balise </ap:description>
<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>
<ap:description>Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique; dit</ap:description>
Sophonie.
Tu as une seule ligne ou plusieur dans ton fichier ?