Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 28/02/2010, 07h43   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Par défaut [sed] supprimer plusieurs chaines similaires sur la même ligne

Bonjour,

J'ai un fichier qui contient des lignes du style

Code :
<a href=url1>lien1</a> blablabla intermédiaire 1 <a href=url2>lien2</a> blablabla intermédiaire 2  <a href=url3>lien3</a> blablabla...
Il peut y avoir de 0 à x liens dans la même ligne (x étant ignoré, bien sûr)

Je veux effacer tous les <a href....> et les </a>
Je commence par effacer les <a href....>
Mais si je fais
Code :
sed 's/<a href.*>//g' fichier1 > fichier2
Ça ne marche pas parce que ça efface du premier "<a href" jusqu'au dernier ">"

Je ne trouve pas la solution tout seul.
Ça ne doit pourtant pas être très compliqué.

Cordialement

Dernière modification par laloupiote ; 28/02/2010 à 15h44.
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 10h18   #2
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bonjour,

Je ne connais pas bien sed et je n'ai pas beaucoup de temps maintenant. Mais je peux te dire où il y a un problème.

La chaîne à substituer commence par "<a href", puis elle continue par des caractère quelconques sauf la suite "a>" et se termine par "a>". Je n'arrive pas à exprimer ce que j'ai écrit en bleu. Quelque chose comme ([^a][^>])*, mais les parenthèses ne regroupent pas le pattern pour l'étoile suivante.

Une idée dans l'assistance?
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 10h38   #3
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Merci pour ta réponse, mais je pense que le problème concerne directement sed. En fait, sed lit les expressions rationnelles et je crois que c'est là finalement qu'il faut chercher.
Comment formuler, dans une expression rationnelle, que je veux sélectioner (pour suppression par sed) la chaîne <a href ....> et que cette chaîne s'arrête au premier > et non pas au dernier ?

Il y aurait une solution, mais je cherche plus "élégant" ce serait, dans un premier temps remplacer les </a> par un saut de ligne
Code :
sed 's/<\/a>/\n/g' fichier1 > fichier2
puis
Code :
sed 's/<a href.*>//' fichier2 > fichier3
Mais bon, après, il faudrait encore enlever les sauts de ligne que j'ai rajoutés.

Dernière modification par laloupiote ; 28/02/2010 à 15h44.
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 15h21   #4
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
les expressions rationnelles en sed sont gourmandes (greedy).
Code :
sed 's/<a href[^>]*>//g; s/<\/a>//g' fichier
Giyf
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 15h47   #5
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Je n'ai pas bien compris, mais ça ne fonctionne pas : mes <a href ...> sont toujours là.
Pour progresser est-ce que le [^>] signifirait qu'il s'agit du premier > qu'il faut prendre en compte ? Et alors, ne faudrait-il pas ajouter .* entre href et [^>] ?

Code :
sed 's/<a href[^>]*>//g; s/<\/a>//g' fichier
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 16h24   #6
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Citation:
Envoyé par laloupiote
est-ce que le [^>] signifirait qu'il s'agit du premier > qu'il faut prendre en compte ?
en gros, oui.

Citation:
Et alors, ne faudrait-il pas ajouter .* entre href et [^>] ?
non :
Code :
1
2
sed 's/<a href[^>]*>//g; s/<\/a>//g' <<<'<a href=url1>lien1</a> blablabla intermédiaire 1 <a href=url2>lien2</a> blablabla intermédiaire 2  <a href=url3>lien3</a> blablabla'
lien1 blablabla intermédiaire 1 lien2 blablabla intermédiaire 2  lien3 blablabla
bof, ça fonctionne...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 23h09   #7
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
J'ai ceci qui marche chez oim:
Code :
sed 's/<a\([^a][^>]\)*a>//g' fichier
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2010, 23h45   #8
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Citation:
Envoyé par laloupiote
Je veux effacer tous les <a href....> et les </a>
laloupiote semble vouloir conserver lien1, lien2... et les blabla intermédiaires
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2010, 08h08   #9
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Laloupiote, peux-tu nous éclairer? Ha, ça y est, je l'ai faite. Désolé, ça me démangeait depuis un moment.

Je n'avais pas compris la même chose. Il est vrai qu'un exemple complet aurait été parfait (ligne avant, ligne après).
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2010, 07h43   #10
Membre à l'essai
 
Inscription : janvier 2006
Messages : 79
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 79
Points : 22
Points : 22
Je suis navré de vous avoir laissé tombés comme cela, mais pour des raisons indépendantes de ma volonté (santé, mais ça va mieux, merci ), j'ai été tenu éloigné de mon ordinateur jusqu'à ce matin. Toutes mes excuses.

Citation:
Envoyé par jmelyn Voir le message
Laloupiote, peux-tu nous éclairer? Ha, ça y est, je l'ai faite. Désolé, ça me démangeait depuis un moment.
Oui, mon pseudo a quelque chose à voir avec cela : cf mon site.

Toutes mes excuses également à N_Bah, parce que la formule qu'il m'a proposée fonctionne bien, mais c'est moi qui n'ai pas su l'adapter correctement du premier coup (je n'avais pas vu, mais il y avait quelques caractères avant href. On va mettre ça sur le compte de mes ennuis .

Mon problème est donc résolu, mais je n'ai pas compris comment. J'avais compris que pour indiquer une série de caractères quelconques, il fallait le coder ".*" et que les crochets permettaient de rechercher les caractères qu'ils contiennent. Auriez-vous des explications ou un lien qui me permette de mieux comprendre ?

Avec mes excuses renouvellées,

Bien cordialement,
laloupiote est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 07h11.


 
 
 
 
Partenaires

Hébergement Web