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 :

Ne remplacer que les extrémités d'une chaine


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut Ne remplacer que les extrémités d'une chaine
    bonjour,

    je ne sais pas comment écrire un substitute sous vi ou un replace sous notepad++ pour transformer une chaîne qui comprend une certaine pattern : par ex: class="info" ou class="infoB".

    le problème est de ne pas changer toute la chaîne mais seulement les extrémités. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a ....class="info"....>texte à conserver</a>
    deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <verd>texte à conserver</verd>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a ....class="infoB"....>texte à conserver</a>
    deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <imm>texte à conserver</imm>
    je vous remercie de votre aide,
    bien cordialement,
    daniel

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    Citation Envoyé par daniel.1
    sous vi ou sous notepad++
    pourquoi ces choix ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Avec vim, il faut utiliser les références arrières.
    Comme avec grep.
    Code vim : Sélectionner tout - Visualiser dans une fenêtre à part
    :s/<a.*class="info".*>\(.*\)<\/a>/<imm>\1<\/imm>/
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Avec vim, il faut utiliser les références arrières.
    Comme avec grep.
    Code vim : Sélectionner tout - Visualiser dans une fenêtre à part
    :s/<a.*class="info".*>\(.*\)<\/a>/<imm>\1<\/imm>/
    super, merci beaucoup !

    amicalement,
    daniel

  5. #5
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    pourquoi ces choix ?
    bonjour,

    sous vi parce que j'ai un Linux et notepad parce que je l'utilise plus fréquemment (sous Windows)

  6. #6
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    au fait, merci d'avoir déplacer ma question au bon endroit!

    heu je ne vois pas "probleme resolu" en bas de la page pour le cliquer...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    mais alors, pourquoi pas ed, ou sed ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    mais alors, pourquoi pas ed, ou sed ?
    oui je regarde aussi à présent que j'ai la commande pour réaliser la substitution. Car j'ai en effet plusieurs fichiers à traiter

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Erratum :
    Dans mon message précédent, il ne fallait pas lire grep, mais sed.

    Le premier ne fait que du filtrage.
    Le second des substitutions. (avec références arrières).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    bonjour,
    désolé de vous embêter de nouveau.
    j'ai fait des essais et je constate que s'il y a des balises ou des retour à la ligne dans le "texte à conserver" ça pose problème (non je ne l'avais pas dit au départ).

    Exemple 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a ....class="infoB"....>texte à <i>surtout</i> conserver</a>
    -> tronque en :
    si je vire les ">" ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <imm>texte à <isurtout</i conserver</imm>
    Exemple 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a ....class="info"....>texte à conserver <BR>
    suite du texte</a>
    -> Pattern not found
    idem si je vire le "<BR>" mais que je laisse le retour à la ligne

    c'est foutu ou y'a une solution?
    merci!
    bonne journée
    daniel

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    c'est pourquoi on recommande de ne pas traiter les langages de balisage (HTML, XML, JSON...) avec le shell, mais avec des outils conçus exprès (XSLT, jq...), ou qui peuvent s'adapter ±facilement (python, perl...).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    bonjour,

    ah, je comprends mais jamais entendu parlé et ça parait pas simple.
    Mais tant pis pour les entités qui ont des retour à la ligne, eux ça dit "Pattern not found" et ils font rien, donc pas de bêtise.
    Par contre pour le ">" ça tronque le texte. Alors peut-être qu'en incluant le ">" dans la partie \(.*\) qui couvre le texte à conserver ça irait...?

    daniel

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    • Pour la balise d'entrée trop grande, il suffit de remplacer .* par [^>]*.
    • Pour les retours à la ligne, il suffit d'utiliser l'option -z de sed.
    • Pour éviter la gourmandise de * et trouver le </a> le plus proche, c'est plus compliqué.
      Il faut filouter.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sed -z 's@</a>@KKKKKK&@g;:z;s@\(<a.*class="info"[^>]*>.*KKKKKK</a>.*\)KKKKKK</a>@\1</a>@;tz;s@<a.*class="info"[^>]*>\(.*\)KKKKKK</a>@<imm>\1</imm>@'
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      sed -z 's@</a>@KKKKKK&@g;:z;s@\(<a.*class="info"[^>]*>.*KKKKKK</a>.*\)KKKKKK</a>@\1</a>@;tz;s@<a.*class="info"[^>]*>\(.*\)KKKKKK</a>@<imm>\1</imm>@' <<<'<a ....class="info"....>texte à conserver <BR>
      suite du texte</a> bidule <a> machin </a>'
      Résultat:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      <imm>texte à conserver <BR>
      suite du texte</imm> bidule <a> machin </a>
      Prise de tête pour la maintenabilité.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    merci beaucoup, je vais essayer. Non, non dans les citations, car il s'agit de citations, il n'y a jamais de <a> imbriqués !!

  15. #15
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Je ne parlais pas d'imbrications.
    S'il y en avait, ce code ne marcherait pas.

    Mais dans ton texte, il y a sûrement de nombreuses ancres. À la suite.
    (Surtout quand on snobbe les fins de ligne)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    glups, j'ai pas tout compris, en tout cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    . s/<a.*class="info".*>\([^>]*\)<\/a>/<verd>\1<\/verd>/
    me sort encore ""

    Pourtant j'ai regardé et en effet le ^ devant un caractère l'exclut...

    mais vous avez sûrement d'autres choses à faire, je suis désolé du dérangement
    daniel

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Relis mieux : ce que tu as tapé n'est pas du tout ce que j'ai écrit.
    Tu as rajouté des caractères inutiles en laissant l'étoile gourmande.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    vous voulez dire que c'est dans qu'il faut remplacer les .* par [^>]* ??
    si oui je ne comprends plus car il n'y a jamais de ">" entre le "<a" et le ">". Le seul endroit possible c'est là où j'ai remplacé...

    Voici un exemple de citation (j'aurais peut-être dû commencer par là ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="info" title="[ Gustave Thibon, de l'Académie Française&nbsp;: 'Notre regard qui manque à la lumière ]">&emsp;« On ne comprend le mal que dans la mesure où on lui échappe&nbsp;; <i>on ne peut pas le faire et le comprendre au même niveau.</i>&nbsp;»</a>
    que j'aimerais transformer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <verd>&emsp;« On ne comprend le mal que dans la mesure où on lui échappe&nbsp;; <i>on ne peut pas le faire et le comprendre au même niveau.</i>&nbsp;»</verd>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a href="javascript:ouvre_popup('Roland.html')" class="infoB" title="[ Messages célestes de Roland de Jouvenel ]">&emsp;« La terre est notre stage d’imperfection où nous sommes livrés à nous-mêmes. Fais attention, car c’est de là que nous prenons notre envol. Je t’assure, tu ne perds pas ton temps, allège-toi, dégage-toi [<curvep>des matérialités</curvep>]. <p class="p0"></p>
    &emsp;Raffine-toi dans le beau, car le point que tu auras atteint sur terre sera le point de départ pour ici.&nbsp;»</a>
    deviendrait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <imm>&emsp;« La terre est notre stage d’imperfection où nous sommes livrés à nous-mêmes. Fais attention, car c’est de là que nous prenons notre envol. Je t’assure, tu ne perds pas ton temps, allège-toi, dégage-toi [<curvep>des matérialités</curvep>]. <p class="p0"></p>
    &emsp;Raffine-toi dans le beau, car le point que tu auras atteint sur terre sera le point de départ pour ici.&nbsp;»</imm>

  19. #19
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Avec xsltproc (sudo apt-get install xsltproc au besoin).

    stylesheet.xsl
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
     
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates  select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
     
        <xsl:template match="a[@class='info']">
            <verd>
                <xsl:apply-templates/>
            </verd>
        </xsl:template>
     
        <xsl:template match="a[@class='infoB']">
            <imm>
                <xsl:apply-templates/>
            </imm>
        </xsl:template>
     
    </xsl:stylesheet>

    et la commande: xsltproc --html --encoding utf-8 stylesheet.xsl tonfichier.html.

    Même si tu n'es pas très familier avec XSLT, tu peux voir que la transformation que tu souhaites faire se résume à deux templates somme toute assez basiques. Tu peux facilement les calquer pour des transformations du même type. (Les attributs match ne sont rien d'autre que du XPath).

    NB:
    • La commande précédante se contente d'afficher le résultat dans le terminal, il est bien sûr possible de rediriger cet affichage vers un fichier (commande > fichier) ou d'utiliser l'option --output de xsltproc. Les transformations xsl ayant la fâcheuse (ou pas) tendance de remplacer automatiquement les entités comme &nbsp; et &emsp; par leur caractère correspondant, il est possible les récupérer avec sed.
      Ce qui donne: xsltproc --html --encoding utf-8 stylesheet.xsl tonfichier.html | sed "s/$(echo -ne '\u2003')/\&emsp;/g;s/$(echo -e '\u00a0')/\&nbsp;/g".
      Si les entités sont plus nombreuses et plus variées, il est possible de procéder autrement en protégeant les entités avant la transformation, n'hésite pas à demander si c'est le cas.
    • Pour éviter les messages d'erreurs du type: HTML parser error : Tag curvep invalid, il faut partir du html "brut" et faire toutes les transformations de tag en même temps dans la même feuille de style xsl.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  20. #20
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 24
    Points : 5
    Points
    5
    Par défaut
    bonjour et merci à toi CosmoKnacki

    ça commence pas très bien.

    sudo apt install xsltproc

    [sudo] Mot de passe de neile*: xxxxx
    E: Impossible d'obtenir le verrou /var/lib/dpkg/lock-frontend - open (11: Ressource temporairement non disponible)
    E: Unable to acquire the dpkg frontend lock
    (/var/lib/dpkg/lock-frontend), is another process using it?

    glups

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/04/2014, 16h44
  2. Remplacer les liens dans une chaine
    Par jesslegende dans le forum Langage
    Réponses: 1
    Dernier message: 15/10/2011, 18h33
  3. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  4. remplacer les cotes dans une chaine de caractère
    Par zut94 dans le forum Langage
    Réponses: 3
    Dernier message: 30/08/2006, 17h38
  5. [langage] remplacer les caractères d'une chaine
    Par perlaud dans le forum Langage
    Réponses: 14
    Dernier message: 12/05/2004, 11h05

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