IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] supprimer plusieurs chaines similaires sur la même ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    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).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<\/a>/\n/g' fichier1 > fichier2
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<a href.*>//' fichier2 > fichier3
    Mais bon, après, il faudrait encore enlever les sauts de ligne que j'ai rajoutés.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    les expressions rationnelles en sed sont gourmandes (greedy).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<a href[^>]*>//g; s/<\/a>//g' fichier
    Giyf
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<a href[^>]*>//g; s/<\/a>//g' fichier

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Citation Envoyé par laloupiote
    est-ce que le [^>] signifirait qu'il s'agit du premier > qu'il faut prendre en compte ?
    en gros, oui.

    Et alors, ne faudrait-il pas ajouter .* entre href et [^>] ?
    non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    J'ai ceci qui marche chez oim:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/<a\([^a][^>]\)*a>//g' fichier
    Un problème bien posé est déjà résolu (H. Bergson).

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    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'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    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).

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    Points : 73
    Points
    73
    Par défaut
    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,

Discussions similaires

  1. mettre plusieur champs formulaire sur la même ligne
    Par cuddy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/09/2012, 18h21
  2. Plusieurs Query écrit sur une même ligne
    Par Invité dans le forum VBScript
    Réponses: 1
    Dernier message: 18/06/2012, 17h31
  3. Réponses: 3
    Dernier message: 26/07/2011, 13h58
  4. Réponses: 2
    Dernier message: 29/11/2006, 11h52
  5. Réponses: 2
    Dernier message: 21/10/2006, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo