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 :

Remplacement en chaine de balises


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 398
    Points : 193
    Points
    193
    Par défaut Remplacement en chaine de balises
    Je dois traiter des fichiers en masse.
    Un fichier sur deux a en première ligne une mention de page. Par exemple, on passe de la page 23 à la page 24:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [23-24]
     Mon texte continue ici...
    Quand une mention de page figure en première ligne d'un fichier, je veux la compléter de la façon suivante.
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span id="page12">[11-12]</span>
    Je dois créer une variable qui enregistre la seconde valeur, 12 dans l'exemple.
    Et c'est là que je bloque...

    NB: les pages vont jusqu'à 500. Il faut donc que je cherche [??-??] et [???-???] en début de ligne.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 249
    Points : 13 472
    Points
    13 472
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed '1s@^\[\([[:digit:]]*\)-\([[:digit:]]*\)\].*@<span id="page\2">[\1-\2]</span>@' <<<"[23-24]
     Mon texte continue ici..."
    <span id="page24">[23-24]</span>
     Mon texte continue ici...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 398
    Points : 193
    Points
    193
    Par défaut
    Merci, j'ai appris plein de choses.
    Mais j'ai deux questions:
    - que signifie 1s? Pourquoi le chiffre 1?
    - Que signifient exactement les trois chevrons à la fin?
    Je suis surpris, parce qu'il n'y a pas l'option 'p' après le dernier @

    Maintenant, ça fonctionne avec l'exemple.
    Comme je veux traiter tous les fichiers qui se trouvent dans le dossier courant, je ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i in * ; do
        sed '1s@[etc...]@[etc...]@' <<< $i
        done
    Comment je peux remplacer chaque ligne dans chacun des fichiers?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 249
    Points : 13 472
    Points
    13 472
    Par défaut
    Tu connais probablement les here-docs qui permettent de rentrer un fichier à la volée sans avoir à en créer un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat <<EOF
    blablabla
    EOF
    Et bien, ici, <<< est un here-string. Comme je n'avais pas envie de créer un fichier, j'ai utilisé cette syntaxe. La chaîne de caractère entre guillemets peut être remplacée par une variable. <<< "$ma_var"

    Mais pour répondre à ta question, dans ton cas, tu mets le nom de ton vrai fichier, comme pour n'importe quel commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 'mon_script' mon_fichier
    que signifie 1s? Pourquoi le chiffre 1?
    Une commande sed répond à 2 questions: "quand?" et "quoi?". Par défaut, la réponse à "quand" est pour toutes les lignes.
    Le "1" signifie "pour la ligne 1".
    Un "11,14" signifie "de la ligne 11 à la ligne 14".
    Un "1,$" signifie "de la ligne 1 à la dernière ligne". ($ en adresse à ne pas confondre avec $ comme fin de ligne)
    Un "/toto/" signifie "si la ligne contient toto".
    Un "/^toto$/" signifie "si la ligne ne contient que toto".
    etc...

    Je suis surpris, parce qu'il n'y a pas l'option 'p' après le dernier @
    Le drapeau p est souvent utilisé quand tu utilises sed à l'inverse. sed 'script' fichier affiche toutes les lignes sauf celles affectées par le script. sed -n 'script' fichier n'affiche aucune ligne sauf celles affectées et "imprimées" par le script.

    Les 2 commandes suivantes sont équivalentes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed '1,4d' fichier
    $ sed -n '5,$p' fichier
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 398
    Points : 193
    Points
    193
    Par défaut
    D'accord. Mais dans mon cas, je veux traiter un lot de fichier.

    J'ai essayé ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in *.md ; do
        sed '1s@^\[\([[:digit:]]*\)-\([[:digit:]]*\)\].*@<span id="page\2">[\1-\2]</span>@' $i
        done
    Problème: toutes les pages s'affichent dans le terminal en tenant compte des modification.
    Mais je veux que les modifications soient intégrées dans les pages en question. Autrement dit, je dis à sed de changer les lignes directement dans le fichier.

    Comment je peux m'y prendre?

    PS: merci pour ces explications détaillées

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 398
    Points : 193
    Points
    193
    Par défaut
    Pardon, autant pour moi: j'ajoute l'option -i à sed.

    Encore merci!

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 296
    Points : 12 773
    Points
    12 773
    Par défaut
    Bonjour,

    La boucle est inutile, sed sait traiter une liste de fichiers.
    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2011
    Messages : 398
    Points : 193
    Points
    193
    Par défaut
    Donc il suffirait de faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1s@etc....' $(ls *.md)

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 296
    Points : 12 773
    Points
    12 773
    Par défaut
    Citation Envoyé par Celano Voir le message
    Donc il suffirait de faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1s@etc....' $(ls *.md)
    Non, ls est aussi inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1s@etc....' *.md
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer le contenu de balises à la chaine
    Par matouz dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 30/10/2014, 10h56
  2. [RegEx] Remplacer une chaine par un lien sans exploser les balises
    Par yahoowaloo dans le forum Langage
    Réponses: 5
    Dernier message: 19/07/2011, 11h39
  3. Remplacer une chaine de caractere entre deux balise
    Par xyrox dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2010, 14h11
  4. [RegEx] remplacer une chaine comprise entre 2 balises
    Par Khleo dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2008, 17h02
  5. Réponses: 4
    Dernier message: 16/04/2004, 16h31

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