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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    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 émérite 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 : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    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?

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    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 642
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 119
    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 642
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    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.

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