Effectivement là je ne vois pas trop comment sed peut le faire...
(Pour l'instant ... je m'y pencherai quand j'aurai le temps.)
Pour la ligne
sed -n '/<title>/s,</\?title>,,gp' atom
Il y a deux choses nouvelles :
- La virgule est utilisé comme délimiteur. En fait la commande « s » de sed peut admettre tout caractère non-alphanumérique pour délimiteur. Même ceux qui ne sont pas visibles (@, !, tabulation, code ascii 1, code ascii 2, etc.)
- Si tu connais un peu les expression rationnelles, le « ? » que j'ai échappé avec un « \ » sert à dire que le caractère précédent apparaît au plus une fois. Cette expression rationnelle
</\?title> vérifiera donc uniquement les chaînes
<title> et
</title>.
Remarque : Tu peux utiliser l'option
-r de sed pour les caractères d'expression régulière ne doivent pas être échappés...
sed -n '/<title>/s=</\?title>==gp' atom
sed -nr '/<title>/s|</?title>||gp' atom
- L'option
g demande que la substitution soit globale. Sans cette option sed n'opère que la première substitution et ne remplace pas
</title>
- Enfin l'option
p pour indiquer à sed d'imprimer le texte substitué. (Sans l'option -n les lignes originale ET substituée sont imprimées.)
Une solution que je n'apprécie pas vraiment, mais qui fonctionne en une ligne avec le script sed suivant :
:boucle;
N;
$!b boucle;
s/\n/\ /g;
s,<title>[^<]*</title>,,;
s,\([^<]\|<[^t]\|<t[^i]\|<ti[^t]\)*<title>\([^<]*\)</title>.*,\2,p;
Ou en une vraie ligne :
sed -ne ':boucle; N; $!b boucle; s/\n/\ /g; s,<title>[^<]*</title>,,; s,\([^<]\|<[^t]\|<t[^i]\|<ti[^t]\|<tit[^l]\|<titl[^e]\|<title[^>]\)*<title>\([^<]*\)</title>.*,\2,p;' atom
Pour être vraiment sûr de ne pas faire de bêtise, il faudrait affiner l'expression de la dernière substitution.
Avec toutes mes recherches depuis maintenant bien longtemps, je n'ai toujours pas réussi à interdire une chaîne de caractères simplement. La seule solution que j'ai trouvée consiste à épeler littéralement le mot qui est à interdire dans l'expression rationnelle.
Une autre façon d'épeler
<title> est de dire qu'on ne veut pas de
<, ou seulement s'il est suivit d'un caractère qui n'est pas un
t, ou alors un
t qui est suivi d'un caractère qui n'est pas un
i ou un
i qui ... Et les conditions s'imbriquent...
Voir ici, car le forum ne me permet pas de poster ces lignes...
Ce code qui est plus difficile à lire à l'avantage de faire,
pour chaque caractère de la ligne,
au plus N tests pour un mot de N lettres. Alors que le précédent en fait
au moins N.
Je te conseille, lorsque tu écris un code avec sed, de le tester dans un script séparé avec une commande par ligne. Ensuite tu les regroupes toutes dans une seule ligne en mettant des « ; » entre les commandes (j'y prends l'habitude même en plusieurs lignes...)
Explication du script :
1-
:boucle définit une « ancre » dans le script.
2-
N indique à sed de mettre la ligne suivante à la suite de la première et de les séparer par
\n
3-
$!b boucle Si ce n'est pas (
! ) la dernière ligne (
$ ), branche-toi (
b ) à l'ancre
boucle.
4-
s/\n/\ /g est une simple substitution...
5-
s,<title>([^<]*)</title>,, supprimer le premier titre en supposant que le caractère
< n'y apparaît pas.
6- Et enfin la dernière substitution, apporte la première occurrence restante de la balise
<title>
Je te conseille, lorsque tu écris un code avec sed, de le tester dans un script séparé avec une commande par ligne. Ensuite tu les regroupes toutes dans une seule ligne en mettant des « ; » entre les commandes (j'y prends l'habitude même en plusieurs lignes...)
Explication du script :
1-
:boucle définit une « ancre » dans le script.
2-
N indique à sed de mettre la ligne suivante à la suite de la première et de les séparer par
\n
3-
$!b boucle Si ce n'est pas (
! ) la dernière ligne (
$ ), branche-toi (
b ) à l'ancre
boucle.
4-
s/\n/\ /g est une simple substitution...
5-
s,<title>([^<]*)</title>,, supprimer le premier titre en supposant que le caractère
< n'y apparaît pas.
6- Et enfin la dernière substitution, apporte la première occurrence restante de la balise
<title>
Merci à toi de partager tes initiatives ! C'est grâce à ça que ce forum avance et est une référence pour beaucoup de distributions...