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 :

Substitution d'une chaîne de caractères


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2021
    Messages : 7
    Par défaut Substitution d'une chaîne de caractères
    Bonjour,

    Je cherche à remplacer du texte dans plusieurs fichiers / lignes selon le contenu de la ligne à une position donnée, voici un exemple de mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aaaaaaaa55aa
    aaaaaaaa12aa
    aaaaaaaaBBaa
    résultat souhaité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    aaZZaZZZ55aa
    aaaZZZZZ12aa
    ZZZaaaaaBBaa


    Si à la position [9-10]=55 alors je remplace les caractères aa à la position 2 et 3 par ZZ et les caractères aaa à la position 6 à 8 par ZZZ

    Si à la position [9-10]=12 alors je remplace les caractères aaaaa à la position 5 à 8 par ZZZZZ


    Si à la position [9-10]=BB alors je remplace les caractères aaa à la position 1 à 3 par ZZZ


    J'ai commencé à écrire un code en perl mais je sèche pour lui passer les conditions


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i -spe " substr($_, $start-1, $end-$start+1) =~ s/./@/g "  -- -start=$debut -end=$fin $my_file
    Je précise que pour chaque ligne je peux avoir à remplacer le texte à plusieurs endroits ( exemple ligne1 )

    Je pensais faire une boucle sur le fichier

    Merci de votre aide.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Pas clair le besoin, mais bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo 'aaaaaaaa55aa
    aaaaaaaa12aa
    aaaaaaaaBBaa
    ' | perl -pe 's/^(..)aa(.)aaa55(..)/\1ZZ\2ZZZ55\3/;s/^(...)aaaaa12(..)/\1ZZZZZ12\2/;s/^aaa(.....BB..)/ZZZ\1/'
    aaZZaZZZ55aa
    aaaZZZZZ12aa
    ZZZaaaaaBBaa

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2021
    Messages : 7
    Par défaut
    Bonjour,
    Merci pour la réponse mais cela ne répond pas vraiment à mon besoin. Mes fichiers font plusieurs millions de lignes j'ai donc besoin de paramétrer mon script et selon la valeur du paramètre ( dans mon exemple : 55, 12, BB) je peux être amener à remplacer entre 1 et plusieurs endroits le texte sur la même ligne.

    J'espère être clair.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Citation Envoyé par the_onee Voir le message
    je peux être amener à remplacer entre 1 et plusieurs endroits le texte sur la même ligne.
    Et les autres endroits, on les délimite comment ? Et on remplace par la même chose ? Une autre ? Comment le sait-on ?

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2021
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2021
    Messages : 7
    Par défaut
    Bonjour,
    Alors je pensais à un fichier de paramétrage, où je mettrai la condition sur la ligne, la position de début et de fin du texte à remplacer selon ma condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    contition;debut;fin
    50;3;4
    50;6;8
    12;5;8
    BB;1;3
    .
    .
    .
    A5;10;12
    Ensuite je fais une boucle sur le fichier de paramètrage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    while read -r line; 
    do
    debut= à récupérer du fichier de param
    fin=à récupérer du fichier de param
    condition=à récupérer du fichier de param
     
    perl -i -spe " substr($_, $start-1, $end-$start+1) =~ s/./@/g "  -- -start=$debut -end=$fin $my_file
     
    done < param

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat afac_texte.txt
    aaaaaaaa55aa
    aaaaaaaa12aa
    aaaaaaaaBBaa
    aaaaaaaa50aa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat afac_schema.txt
    contition;debut;fin
    50;3;4
    50;6;8
    12;5;8
    BB;1;3
    A5;10;12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk '(NR==1){next;} (NR==FNR){n[$1]++;deb[$1,n[$1]]=$2;fin[$1,n[$1]]=$3;next;} {ex=substr($0,9,2);} (n[ex]>0){for (nc=1;nc<=n[ex];nc++) for (i=deb[ex,nc];i<=fin[ex,nc];i++) $i="@";} 1' FS=";" afac_schema.txt OFS="" FS="" afac_texte.txt
    aaaaaaaa55aa
    aaaa@@@@12aa
    @@@aaaaaBBaa
    aa@@a@@@50aa
    Quelques explications :
    (NR==1){next;} se débarrasse juste de la première ligne d'en-têtes du fichier de remplacements.
    (NR==FNR){blablabla;next;} sert à ne s'appliquer que sur le premier fichier. Le reste du code sur les autres fichiers.
    {ex=blablabla} sert à ne pas recalculer l'extrait à chaque utilisation. On pourrait s'en passer.
    1 sert à afficher la ligne, quoi qu'il arrive.
    FS=";" afac_schema.txt OFS="" FS="" afac_texte.txt sert à avoir un séparateur de champ (Field Separator) différent pour chaque fichier. (pas courant ! )

    Le reste est laissé à ton étude.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Par défaut
    Bonjour
    Citation Envoyé par the_onee Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while read -r line; 
    do
    debut= à récupérer du fichier de param
    fin=à récupérer du fichier de param
    condition=à récupérer du fichier de param
     
    perl -i -spe " substr($_, $start-1, $end-$start+1) =~ s/./@/g "  -- -start=$debut -end=$fin $my_file
     
    done < param
    Pour ce qui est de la lecture des variables, voici un modèle avec un point-virgule comme séparateur de champ. Pas besoin de l'option -r dans read (s'il n'y a pas de caractère "\" dans la ligne à lire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    while IFS=";" read COND DEB FIN  ; do
        echo COND = $COND DEB = $DEB FIN = $FIN
    done <<EOF
    50;3;4
    50;6;8
    12;5;8
    EOF
    Pour la commande de transformation des données, tu pourrais utiliser, semble-t-il, perl ou bien sed, mais il faudrait que tu saches vraiment ce que tu veux faire. ("Ce qui se conçoit bien, s'énonce clairement")

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01
  3. [Debutant(e)] Analyse d'une chaîne de caractères
    Par maire106 dans le forum Langage
    Réponses: 6
    Dernier message: 22/03/2004, 15h04
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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