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] je dois substituer des expressions


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    Juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 42
    Points : 38
    Points
    38
    Par défaut [sed] je dois substituer des expressions
    Bonjour !
    Moi aussi j’essaie de faire des modifications à l’aide de la commande sed !

    Dans environs une centaine de fichiers je dois substituer des expressions de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CALL MICHU(ZERO, XUSE , NCL*15   )                                
    [oubien]
    CALL MICHU( -ONE, DAXDR , MMS )
    […]

    En gros, des éléments ayant la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL MICHU(BLOC_1,BLOC_2,BLOC_3)
    En l’expression suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BLOC_2(1:BLOC_3) = BLOC_1
    CALL MICHU(BLOC_1,BLOC_2,BLOC_3) -> BLOC_2(1:BLOC_3) = BLOC_1


    Je sais que c’est réalisable avec sed, mais je n’ai pas réussi à trouver la syntaxe pour organiser à ma guise les différents blocs.

    J’ai plusieurs centaines d’occurrence à traiter et je sais que je devrais probablement terminer certaines expressions sans la commande sed … mais peut-être que si j’arrive à la comprendre suffisamment …
    En faite, 90% de mes expressions ont cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CALL MICHU(BLOC_1,BLOC_2,BLOC_3) 
              |
              V
    BLOC_2(1:BLOC_3) = BLOC_1
    Et … ensuite j’anticipe deux types d’occurrences difficiles :
    J’ai des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF( IBBK==2 ) CALL MICHU(0.0D0,T,IJF*KKFD )
    C’est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF( IBBK==2 ) CALL MICHU(BLOC_1,BLOC_2,BLOC_3)
    Qu’il me faudra transformer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF( IBBK==2 ) T(1,IJF*KKFD) = 0.0D0
    C’est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF( IBBK==2 ) BLOC_2(1:BLOC_3) = BLOC_1
    Bon après j’ai quelques expressions vraiment hardcore du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL MICHU ( 0.0D0, QS(1,1,1), (IT+2)*(JT+2)*(KT+2) )
    Que je devrais transformer en …
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QS(1: (IT+2)*(JT+2)*(KT+2),1,1) = 0.0D0
    mais … ça c’est une autre histoire … et je crois qu’il ne vaut mieux pas en parler …. (Surtout que … ce sont des expressions FORTRAN … je pense que au final la forme pourrait être encore autre chose ... )

    Merci :-*

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    Juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Merci les amis ! Je savais que vous aviez confiance en moi et que vous saviez que je pouvais y arriver tout seul.
    Donc voici une commande que je viens d'utiliser et qui fonctionne pour faire ce dont j'ai besoin :

    La commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/CALL MICHU(\(.*\),\(.*\),\(.*\))/\2(1:\3)=\1/'
    m'a permis de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL MICHU( 0.0D0,FLUX,IJKT )
    par :
    Je vais expliquer la syntaxe par ce que sinon elle fait vraiment mal aux yeux :

    la commande générale de sed est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/EXPRESSION_RECHERCHE/EXPRESSION_DE_REMPLACEMENT/' fichier_entre.txt
    Dans l'expression_recherche, il est possible de définir des regroupements de motifs :
    pour cela, il suffit très simplement de mettre entre parenthèse ( ) le ou les motifs que l'on souhaite isoler.
    Dans l'expression de sortie, si l'on souhaite réutiliser un motif, il suffit de le mentionner par son ordre d'identification. Ainsi, on peut par exemple inverser l'ordre de certain motif.
    Mais !! Attention, pour ne pas que les parenthèses ( ) que l'on utilise dans le motif de recherche ou le numéro d'identification que l'on utilise dans l'expression de remplacement ne soient confondu avec des motifs de recherche ou des expression à écrire .... ben il faut juste les faire précéder du caractère d’échappement \ anti-slash !!

    Voila, au final, l'expression que j'ai utilisé est de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/EXPRESSION_RECHERCHE/EXPRESSION_DE_REMPLACEMENT/' fichier_entre.txt > fichier_sortie.txt
    Les dernières choses que je dois trouver c'est :
    Question 1 :
    pourquoi certains utilise l'option /g ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's///'  ?? ou sed -e 's///g'
    Question 2 :
    Je n'ai pas réussi à faire un sed le fichier lui même !
    J'ai été obligé de rediriger la sortie dans un autre fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's///' fichier_entree.txt > fichier_sortie.txt
    Est-il possible d'effectuer le sed directement dans le fichier ?

    Et sinon, si vous avez des questions sur le remplacement en définissant des motifs, vous pouvez me demander!
    Merci beaucoup !!

  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

    • C'est pareil sur tous les forums, on ne trolle pas les questions des autres. Il fallait ouvrir une nouvelle discussion.
    • Y arriver tout seul, c'est ce qu'il y a de meilleur.
    • Le 'g' veut dire 'global'. Sinon, il ne substitue qu'une fois.
    • Intéresse toi à l'option "-i" pour le changement sur place, avec ou sans backup.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    Juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    • C'est pareil sur tous les forums, on ne trolle pas les questions des autres. Il fallait ouvrir une nouvelle discussion.
    • Y arriver tout seul, c'est ce qu'il y a de meilleur.
    • Le 'g' veut dire 'global'. Sinon, il ne substitue qu'une fois.
    • Intéresse toi à l'option "-i" pour le changement sur place, avec ou sans backup.
    • Je ne savais pas ... au contraire, j'aurais pensé qu'il valait mieux ne pas multiplier les sujets similaire. (et je ne suis pas un troll )
    • Oui
    • OK, c'est pour ré-substituer dans le nouveau motif c'est ça ? c'est à dire il repasse en boucle même après que la substitution soit passer sur la ligne ?
    • ok -i est l'option qu'il me fallait ... (je n'ai rien trouver sur l'histoire du backup)


    Et il y a une façon de rechercher dans plusieurs sous-directory ? */* ? ça va marcher ça :-D
    ... Oui ça marche :-*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/CALL MICHU(\(.*\),\(.*\),\(.*\))/\2(1:\3)=\1/' */*.txt
    Ahh ... et si j'ai plusieurs sous-sous dossier !!??!!! ... bon j'arrête de vous ennuyer avec ça ... je vais m'en sortir avec des */*/*.txt ...

    Merciiiiiii !

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par Wire.Less Voir le message
    • OK, c'est pour ré-substituer dans le nouveau motif c'est ça ? c'est à dire il repasse en boucle même après que la substitution soit passer sur la ligne ?
    Non, sans le global, il traite juste la première occurrence trouvée de ton motif, avec le global, il traite toutes les occurrences de ton motif qu'il trouve, il ne revient pas en arrière...

    Si c'était le cas, il bouclerait à l'infini dans le cas suivant par exemple: s/./&&/g.

    Il ne te reste plus qu'à traiter ton dernier cas...
    Cordialement.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    Juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Ok, je comprends ...
    Citation Envoyé par disedorgue Voir le message
    Si c'était le cas, il bouclerait à l'infini dans le cas suivant par exemple: s/./&&/g.
    Sauf cet exemple que je ne comprends pas ... mais bon ...



    Il ne te reste plus qu'à traiter ton dernier cas...
    Pour mon dernier cas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL MICHU ( 0.0D0, QS(1,1,1), (IT+2)*(JT+2)*(KT+2) )
    ...je penses que ... ma ligne de commande utilise des propriétés du langage Fortran que je ne souhaite pas réutiliser ...
    en gros ma sous routine MICHU joue sur le fais que les sous routine n'ont pas la possibilité de discerner les dépassement d'indice de tableau ... le tableau passé en paramètre est de dimension 3 mais la sous-routine MICHU la traite comme un sous-tableau de dimension 1 ! C'est de la triche !! C'est juste que le compilateur n'a aucun moyen de vérifier cette irrégularité.

    Mais moi je ne vais pas tricher ... donc je vais le traiter à la mano :-*
    En gros, il ne faudrait pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QS(1: (IT+2)*(JT+2)*(KT+2),1,1) = 0.0D0
    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QS(1: IT+2,1:JT+2,1:KT+2) = 0.0D0
    Merci encore.

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ls afac*.txt
    afac.txt
    $ ls */afac*.txt
    afacdir/afac.txt
    $ ls **/afac*.txt                                                                                                     
    afacdir/afac.txt
    $ shopt -s globstar
    $ ls **/afac*.txt
    afacdir/afacdir/afacdir/afac.txt  afacdir/afac.txt  afac.txt
    $ shopt -u globstar                                                                                                   
    $
    Activer l'option "globstar" débloque ** pour qu'il aille fouiller dans les dossiers, quelque soit le niveau (même zéro).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    Juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2015
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Activer l'option "globstar" débloque ** pour qu'il aille fouiller dans les dossiers, quelque soit le niveau (même zéro).
    Merci A présent j'ai tout ce qu'il me faut!
    Bonne fin de semaine à tous !

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

Discussions similaires

  1. projet Access, comment créer des expressions ?!?
    Par laville dans le forum Access
    Réponses: 5
    Dernier message: 19/04/2006, 12h27
  2. Réponses: 1
    Dernier message: 03/02/2006, 12h35
  3. [RegEx] Traduire des "expression régulières" VBA en PHP
    Par jcachico dans le forum Langage
    Réponses: 13
    Dernier message: 19/01/2006, 14h02
  4. Recherche recursive à l'aide des expressions reguliére
    Par titoff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2005, 16h42
  5. Substituer des caractères d'un AnsiString
    Par Walm dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/12/2003, 10h02

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