Commande sed bash

Résolu/Fermé
powerebonn - 7 nov. 2010 à 14:28
 Dbldou - 15 déc. 2010 à 16:47
Bonjour,
je voudrais par exemple pour :
<text:h text:style-name="bloublou" text:outline-level="1"><balise aléatoire></balise></text:h><text:h text:style-name="bloublou" text:outline-level="2"><balise aléatoire2></balise><balise aléatoire1></balise></text:h>
afficher
<h1><balise aléatoire></balise></h1><h2><balise aléatoire2></balise><balise aléatoire1></balise></h2>


Pour cela, j'utilise la commande sed mais ça ne marche pas quand je fais ça :
baliseh='echo $contenu | sed -e 's/<text:h text:style-name="[^"]*" text:outline-level="\([^"]*\)">\([^*]*\)<\/text:h>'/<h\1>\2<\/\1>/g'

En fait le résultat de cette commande fait <h1></h1> il avale tout le contenu entre les balises comme s'il ne repérait pas en premier obstacle </text:h> car il va prendre la dernière balise </text:h> pour fermer le h.
Merci de votre aide. Nico.
A voir également:

5 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
7 nov. 2010 à 16:45
Salut,

Essaye ça :

sed -n 's#[^[:digit:]]*"\(.\).>\([^:]*\)</text:h>#<h\1>\2</h\1>#gp'

;-))
0
Bonjour, merci de ta réponse, en fait le fichier n'est pas composé seulement que des balise <text:h> il y en a beaucoup d'autres comme <text:style> dans le fichier lui même, j'ai déjà réussi à traiter ces autres balises mais le text:h bloque car en fait le fichier se présente sous cette forme : <text:span.><text:h.....><text:style>il peut y avoir des numéro ici ou n'importe quel autres balisesblabla</text:style></text:h>Blabla</text:span>
et pour l'instant j'ai réussi à transformer mais les je voudrais juste afficher les balises h en <h1ou2ou3...>et là de dans tout plein de balise d'un nombre totalement indépendant <text:tada num="4">46 blabla</text:tada></h1ou2ou3..>

J'ai testé ta solution mais elle n'affiche rien à l'écran.
Merci de ton aide, =)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
7 nov. 2010 à 17:30
Sur le morceau de texte que tu as donné, cette syntaxe marche :

$ echo $A
<text:h text:style-name="bloublou" text:outline-level="1"><balise aléatoire></balise></text:h><text:h text:style-name="bloublou" text:outline-level="2"><balise aléatoire2></balise><balise aléatoire1></balise></text:h>

$ echo $A | sed -n 's#[^[:digit:]]*"\(.\).>\([^:]*\)</text:h>#<h\1>\2</h\1>#gp'
<h1><balise aléatoire></balise></h1><h2><balise aléatoire2></balise><balise aléatoire1></balise></h2>

$

Après c'est l'éternel problème, si vous ne nous donnez pas les exemples concrets, il est impossible de pondre une regex optimisée et adéquate ;-((
0
Désolé de n'avoir pas été assez précis, je vous donne l'exemple complet de ce que j'ai à convertir :
<text:h text:style-name="Heding20_2" text:outline-level="2"><span class="T1">Texte</span><img src="url.jpg" alt="image"/><span class="T2">Texte</span></text:h><text:h  text:style-name="Heding10_1" text:outline-level="1"><text:p>Le texte</text:p></text:h>


Voici ce que j'aimerai en faire :
<h2><span class="T1">Texte</span><img src="url.jpg" alt="image"/><span class="T2">Texte</span></h2><h1><text:p>Le texte</text:p></h1>


Voilà j'ai essayé de vous expliquer au mieux par un exemple précis ici, merci de votre aide =)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
7 nov. 2010 à 18:37
$ echo $B
<text:h text:style-name="Heding20_2" text:outline-level="2"><span class="T1">Texte</span><img src="url.jpg" alt="image"/><span class="T2">Texte</span></text:h><text:h text:style-name="Heding10_1" text:outline-level="1"><text:p>Le texte</text:p></text:h>

$B | sed -n 's#[^_]*_."[^[:digit:]]*"\(.\).>\([^h]*\)</text:h>#<h\1>\2</h\1>#gp'
<h2><span class="T1">Texte</span><img src="url.jpg" alt="image"/><span class="T2">Texte</span></h2><h1><text:p>Le texte</text:p></h1>

$

Par contre il ne faut pas que "Texte" ou "Le texte" contienne la lettre "h" ;-((
0
Aie on ne pourra pas écrire la lettre h dans le texte, c'est assez embêtant, on ne peut pas faire [^</text:h>]* pour s'arrêter à cette balise là snif..
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
7 nov. 2010 à 18:50
Avec ça ça devrait le faire :

sed -n 's#[^_]*_."[^[:digit:]]*"\(.\).>\([^:][^h]*\)</text:h>#<h\1>\2</h\1>#gp'
;-))
0
merci beaucoup beaucoup je chercher la meme chose ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Super, c'est ça que je cherchais merci! le [^:][^h] voilà ce qui me bloquait la syntaxe!
0