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 :

regexp d'exclusion pour sed


Sujet :

Shell et commandes GNU

  1. #1
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut regexp d'exclusion pour sed
    Bonjour à tous.
    Il y a belle lurette que je n'ai plus écrit une ligne de code PHP (ou autre d'ailleurs) aussi vais-je essayer de me montrer le plus clair possible.
    J'avais d'abord posté, par un vieux réflexe, sur le forum PHP dédié aux regexp mais je ne suis pas sûr que le fonctionnement des fonctions preg_replace et preg_match soient assimilables à ceux de sed et grep.
    Pour les besoins de la construction d'un moteur de recherche sur mon site de chansons je voudrais trouver un motif de regexp qui excluerait tout ce qui est entre crochets, crochets compris.
    Un exemple valant souvent mieux qu'un long discours, disons que j'ai des choses comme cela (dans plus de 750 fichiers différents):
    "[Bm]Elle est vapeur dans le nu[A]age,\n",
    "dans le ruisseau ce babi[G]llage.\n",
    "Elle est la pluie sur ma [F#]peau.\n\n",
    "[Bm]Elle est la vague sur la [A]plage,\n",
    "la cascade dans les al[G]pages.\n",
    "Elle est embruns sur mon ba[F#]teau.\n\n",
    "[D]Elle est source de toute [Em]chose.\n",
    "C‘est sur elle que la vie re[D]pose\n",
    "qu‘elle soit glace dans les né[Em]vés\n",
    "ou grêlons dans les gibou[F#]lées.\n\n",
    "[D]Quand elle irrigue les plants de [Em]riz\n",
    "ou bien qu‘elle éteint l‘incen[D]die,\n",
    "elle accomplit tant de prou[Em]esses\n",
    "qu‘on d‘vrait bien en faire notre dé[F#]esse.\n\n",
    "[Bm]Elle est neige dans le bli[A]zzard,\n",
    "voile cotonneux dans le broui[G]llard\n",
    "et même la sueur sur ma [F#]peau.\n\n",
    "[Bm]Elle sait se glisser n‘importe [A]où,\n",
    "en filet ou en gros re[G]mous,\n",
    "rien ne résiste à ses a[F#]ssauts.\n\n",
    "[D]Elle a englouti la ville [Em]d‘Ys"
    et que je souhaiterais obtenir ceci
    "Elle est vapeur dans le nuage,\n",
    "dans le ruisseau ce babillage.\n",
    "Elle est la pluie sur ma peau.\n\n",
    "Elle est la vague sur la plage,\n",
    "la cascade dans les alpages.\n",
    "Elle est embruns sur mon bateau.\n\n",
    "Elle est source de toute chose.\n",
    "C‘est sur elle que la vie repose\n",
    "qu‘elle soit glace dans les névés\n",
    "ou grêlons dans les giboulées.\n\n",
    "Quand elle irrigue les plants de riz\n",
    "ou bien qu‘elle éteint l‘incendie,\n",
    "elle accomplit tant de prouesses\n",
    "qu‘on d‘vrait bien en faire notre déesse.\n\n",
    "Elle est neige dans le blizzard,\n",
    "voile cotonneux dans le brouillard\n",
    "et même la sueur sur ma peau.\n\n",
    "Elle sait se glisser n‘importe où,\n",
    "en filet ou en gros remous,\n",
    "rien ne résiste à ses assauts.\n\n",
    "Elle a englouti la ville d‘Ys"
    À cette fin j'ai écrit une commande que j'appelle via la fonction PHP shell_exec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                    /*supprimer les accords avec une commande (sed) et filtrer le résultat du (sed) en le redirigeant (| pipe) vers une commande(grep($motif))
                     explicitation de la regexp : "s/\[[^\]]*\]//g"/ représente, potentiellement, tous les accords incrustés dans le texte entre [ et ]
                                  s pour subsitute
                                  / délimiteur, début de regexp
                                  \[ doit commencer par un crochet ouvrant, 
                                  [^\]]* 0 à n caractères autres que crochet fermant
                                  \] crochet fermant
                                  / délimiteur fin de regexp
                                  substituer rien aux couples [ ] et son contenu ([^\]]*)
                                  / délimiteur fin de substitution
                                  g pour global, c.a.d. appliquer sur l'ensemble de la ligne
                    */
                    $fouille=shell_exec('sed "s/\[^\]*]\]//g" '.$chant.' | grep -i "'.$motif.'"');// avec -i de grep on est “case non-sensitive”
    Le grep fonctionne correctement sur le résultat que lui fournit le sed (j'ai testé la commande en console), mais, le sed ne fournissant pas le résultat escompté le grep ne trouve pas certaines occurences au sein desquelles sont incrustés des accords.
    Il doit donc y avoir un truc qui n'est pas bon dans la regexp du sed.
    Je l'ai testé en console avec des résultats incohérents, ça fonctionne sur quelques rares fichiers et pas sur les autres sans que j'arrive à déterminer pourquoi.
    Dans l'idéal, j'aurais voulu, pour des raisons de performances, que le shell s'appliquât à l'intégralié de arrays/*.php, mais, avec le pipe (|) vers grep, on perd la référence au fichier puisqu'il ne connait plus que la stdin, or cette référence m'est indispensable ensuite pour proposer des liens vers les chansons qui matchent avec la recherche, donc je suis obligé de lancer la commande shell_exec dans une boucle sur chaque fichier du dossier arrays.
    Mais, essayons déjà de résoudre le problème de la regexp du sed.
    Merci d'avance à quiconque prendra le temps de me lire et de me répondre.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

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

    pourquoi php_exec ? php ne sait pas faire ce genre de substitution ?

    c'est un langage très évolué, ce serait très étonnant.

    et d'ailleurs, pourquoi php ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Bonjour, N_Bah et merci de te pencher sur mon problème.
    En fait, vu le volume des infos à traiter à chaque recherche (environ 750 fichiers d'une centaine de lignes chacun), j'ai pensé que demander directement au serveur Linux de faire le gros du boulot avec sed et grep devrait accélérer le processus.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Pour ta commande sed, c'est : sed "s/\[[^]]*\]//g".
    Par ailleurs, pour éliminer le pipe avec le grep, tu peux faire : sed -n "s/\[[^]]*\]//g; /'.$motif.'/Ip", sachant que le I est une extension GNU.

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Merci Balkany,
    Ta syntaxe diffère de la mienne en ce que tu n'y échappes pas le crochet à l'intérieur du groupe
    [^]]*
    Ça me surprend un peu mais je viens de la tester et, hélas, elle ne supprime pas non plus les accords.
    Voici le résultat du lacement depuis la console
    papimoko@papimoko-Aspire-Z3-600:~$ sed "s/\[[^]*]\]//g" /var/www/AMKK/arrays/eaudevie.php :
    <?php
    $charsize=18;
    $kanto=array('rango'=>741,
    'titolo'=>'Eau de vie',
    'subtitolo'=>'“bruit de ruisseau”, Joseph SARDIN, lasonotheque.org',
    'dato'=>'26 nov. 2019',
    'kreatita'=>'20191126',
    'autoro'=>'Copyleft MoKo',
    'capo'=>'[Capo 2°]',
    'pagxoj'=>array(1=>array(array('tipo'=>'strofo',
    'versoj'=>array("[Bm]Elle est vapeur dans le nu[A]age,\n",
    "dans le ruisseau ce babi[G]llage.\n",
    "Elle est la pluie sur ma [F#]peau.\n\n",
    "[Bm]Elle est la vague sur la [A]plage,\n",
    "la cascade dans les al[G]pages.\n",
    "Elle est embruns sur mon ba[F#]teau.\n\n",
    "[D]Elle est source de toute [Em]chose.\n",
    "C‘est sur elle que la vie re[D]pose\n",
    "qu‘elle soit glace dans les né[Em]vés\n",
    "ou grêlons dans les gibou[F#]lées.\n\n",
    "[D]Quand elle irrigue les plants de [Em]riz\n",
    "ou bien qu‘elle éteint l‘incen[D]die,\n",
    "elle accomplit tant de prou[Em]esses\n",
    "qu‘on d‘vrait bien en faire notre dé[F#]esse.\n\n",
    "[Bm]Elle est neige dans le bli[A]zzard,\n",
    "voile cotonneux dans le broui[G]llard\n",
    "et même la sueur sur ma [F#]peau.\n\n",
    "[Bm]Elle sait se glisser n‘importe [A]où,\n",
    "en filet ou en gros re[G]mous,\n",
    "rien ne résiste à ses a[F#]ssauts.\n\n",
    "[D]Elle a englouti la ville [Em]d‘Ys"
    ),
    'cesure'=>true
    )
    ),
    2=>array(array('tipo'=>'strofo',
    'versoj'=>array("mais, quand j'ai soif, quel dé[D]lice !\n",
    "Elle peut tout recouvrir de [Em]boue\n",
    "ou tout faire briller comme un [F#]sou.\n\n",
    "[D]Elle pousse les aubes du mou[Em]lin,\n",
    "creuse les ornières du che[D]min,\n",
    "porte les bateaux mais, y-a un [Em]hic,\n",
    "elle a fait couler l‘Tita[F#]nic.\n\n",
    "[Bm]Elle est vapeur dans le nu[A]age,\n",
    "dans le ruisseau ce babi[G]llage.\n",
    "Elle est la pluie sur ma [F#]peau.\n\n",
    "[Bm]Elle est la vague sur la [A]plage,\n",
    "la cascade dans les al[G]pages.\n",
    "Elle est embruns sur mon ba[F#]teau.\n\n",
    "[D]Elle est source de toute [Em]chose.\n",
    "C‘est sur elle que la vie re[D]pose\n",
    "qu‘elle soit glace dans les né[Em]vés\n",
    "ou grêlons dans les gibou[F#]lées.\n\n",
    "[D]Quand elle irrigue les plants de [Em]riz\n",
    "ou bien qu‘elle éteint l‘incen[D]die,\n",
    "elle accomplit tant de prou[Em]esses\n",
    "qu‘on d‘vrait bien en faire notre dé[F#]esse."
    )
    )
    )
    ),
    'accords'=>array('titolo'=>'Accords utilisés',
    'versoj'=>array(array('A','Bm'),
    array('D','Em'),
    array('F#','G')
    )
    ),
    'bildo'=>'goutte.jpg'
    );
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    sed "s/\[.*?\]//g"
    Ça n'est pas la commande que j'ai indiquée (même si tu as édité ton message entre deux apparemment) :
    Code : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    $ cat chanson
     "[Bm]Elle est vapeur dans le nu[A]age,\n",
    "dans le ruisseau ce babi[G]llage.\n",
    "Elle est la pluie sur ma [F#]peau.\n\n",
    "[Bm]Elle est la vague sur la [A]plage,\n",
    "la cascade dans les al[G]pages.\n",
    "Elle est embruns sur mon ba[F#]teau.\n\n",
    "[D]Elle est source de toute [Em]chose.\n",
    "C‘est sur elle que la vie re[D]pose\n",
    "qu‘elle soit glace dans les né[Em]vés\n",
    "ou grêlons dans les gibou[F#]lées.\n\n",
    "[D]Quand elle irrigue les plants de [Em]riz\n",
    "ou bien qu‘elle éteint l‘incen[D]die,\n",
    "elle accomplit tant de prou[Em]esses\n",
    "qu‘on d‘vrait bien en faire notre dé[F#]esse.\n\n",
    "[Bm]Elle est neige dans le bli[A]zzard,\n",
    "voile cotonneux dans le broui[G]llard\n",
    "et même la sueur sur ma [F#]peau.\n\n",
    "[Bm]Elle sait se glisser n‘importe [A]où,\n",
    "en filet ou en gros re[G]mous,\n",
    "rien ne résiste à ses a[F#]ssauts.\n\n",
    "[D]Elle a englouti la ville [Em]d‘Ys" 
    $ 
    $ sed "s/\[[^]]*\]//g" chanson 
     "Elle est vapeur dans le nuage,\n",
    "dans le ruisseau ce babillage.\n",
    "Elle est la pluie sur ma peau.\n\n",
    "Elle est la vague sur la plage,\n",
    "la cascade dans les alpages.\n",
    "Elle est embruns sur mon bateau.\n\n",
    "Elle est source de toute chose.\n",
    "C‘est sur elle que la vie repose\n",
    "qu‘elle soit glace dans les névés\n",
    "ou grêlons dans les giboulées.\n\n",
    "Quand elle irrigue les plants de riz\n",
    "ou bien qu‘elle éteint l‘incendie,\n",
    "elle accomplit tant de prouesses\n",
    "qu‘on d‘vrait bien en faire notre déesse.\n\n",
    "Elle est neige dans le blizzard,\n",
    "voile cotonneux dans le brouillard\n",
    "et même la sueur sur ma peau.\n\n",
    "Elle sait se glisser n‘importe où,\n",
    "en filet ou en gros remous,\n",
    "rien ne résiste à ses assauts.\n\n",
    "Elle a englouti la ville d‘Ys" 
    $

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Tu as raison, je ne sais pas ce que j'ai fait, mais bref :
    Voilà ce que j'obtiens en console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    papimoko@papimoko-Aspire-Z3-600:~$ sed "s/\[[^]]*\]//g" /var/www/AMKK/arrays/eaudevie.php | grep -i "\<notre déesse\>"
                                                                "qu‘on d‘vrait bien en faire notre déesse.\n\n",
                                                                "qu‘on d‘vrait bien en faire notre déesse."
    Pourquoi ne faut-il pas échapper le \ dans la définition du groupe l'excluant [^]] ?

    Ce qui m'intéresse tout autant c'est ce que tu semblais dire (mais apparemment tu l'as effacé) à propos d'une option GNU pour conserver le nom du fichier source …
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Pourquoi ne faut-il pas échapper le \ dans la définition du groupe l'excluant [^]] ?
    Parce que les caractères spéciaux sont considérés littéralement lorsque mis entre crochets.
    Si bien que [^\]] signifierait : « un caractère différent de \, suivi de du caractère ].
    Pour t'en convaincre, tu peux faire : echo 'ac]a' | grep '[^\]]', et observer la coloration par grep en sortie.
    Citation Envoyé par Maljuna Kris Voir le message
    Ce qui m'intéresse tout autant c'est ce que tu semblais dire (mais apparemment tu l'as effacé) à propos d'une option GNU pour conserver le nom du fichier source …
    Non, je n'ai jamais parlé de ça, et je n'ai rien effacé : mon édition du message #4 était pour ajouter la remarque à propos de l'élimination du pipe.
    La seule extension GNU dont j'ai parlé est le I, pour être insensible à la casse lors de l'évaluation des expressions régulières dans sed.

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Non, je n'ai jamais parlé de ça, et je n'ai rien effacé : mon édition du message #4 était pour ajouter la remarque à propos de l'élimination du pipe.
    La seule extension GNU dont j'ai parlé est le I, pour être insensible à la casse lors de l'évaluation des expressions régulières dans sed.
    Oui, je me trompais de message, décidément il est temps que je fasse une pause.

    Par contre, là je perds l'identifiant du fichier source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sed -n "s/\[[^]]*\]//g; /\<loups\>/Ip" /var/www/AMKK/arrays/*.php
    	      				    'versoj'=>array("Nous sommes pires que des loups\n",
    Nous sommes pires que des loups
    							    "les meutes de loups faméliques,\n",
    	      				    'versoj'=>array("Je ne hurle pas avec les loups,\n",
    	      				    'versoj'=>array("On dit qu‘les loups n‘sont qu‘de gros chiens\n",
                                                                "entre chiens et loups,\n",
                                                                "Si j‘entendais les loups hurler dehors\n",
                                                                "(Je dis cela pour les loups du dehors).\n\n",
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  10. #10
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ah oui, sed ne conserve pas cela, à moins que tu lui fasses éditer les fichiers sur place, en faisant une sauvegarde des originaux, avec l'option -i.bak, mais ce n'est peut-être pas ce que tu veux.
    Sinon, tu peux passer par gawk, avec quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk 'BEGIN{IGNORECASE=1} {sub(/\[[^]]*\]/,"")} /\<loups\>/{print FILENAME ": " $0}'
    Je précise gawk, car là aussi, le IGNORECASE est une extension GNU.

  11. #11
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Oui, c'est grep qui retourne, quand ce n'est pas l'entrée standard, le nom du fichier source.

    Je vais laisser décanter tout cela et je regarderai awk demain, mais je suis déjà très content, la réalisation du cœur de mon moteur de recherche a bien avancé, grâce à toi.

    Merci mille fois.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut (g()AWK, what else ?
    Un très grand MERCI, balkany, de m'avoir orienté vers AWK.

    C'était, à l'évidence, LA solution pour le cœur de mon moteur de recherche.
    J'en reste scotché, une seule ligne de commande et je récupère, en outre très rapidement, tout ce qui m'est nécessaire et qui est noyé dans les près de 70 000 lignes des 75 fchiers de description de mes chansons.

    Dès que je l'aurais finalisé, je reviendrai mette ici un lien vers le résultat.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut encore un petit souci pour remplacer les "'" par des "‘'
    Je peaufine, je peaufine,
    Je souhaiterais remplacer les caractères quote ou apostrophe ' (#29 en hexa) par des caractères ‘ (#1F en hexa)
    J'ai donc ajoutéà ma commande gawk.
    Mais gawk ne digère pas cette syntaxe et je tourne en rond…
    Une idée ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  14. #14
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Comme le programme awk doit se trouver entre guillemets simples, il faut que tu les fermes, puis que tu concatènes ce programme avec un guillemet simple protégé \', puis que tu les rouvres pour continuer le programme. Par ailleurs, l'apostrophe doit se trouver entre guillemets doubles dans gsub (qui ici pourrait simplement être sub).
    Au final, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{sub(/'\''/,"‘")}'

  15. #15
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut Je teste, je teste, comme un fou furieux
    Et ça finit par fonctionner, en local.
    Il faut dire que j'invoque la commande au sein d'un script PHP et que, du coup, entre les échappement des \" et des \' il y a des différences avec le moment au je teste dans la console Linux.
    Bon, maintenant il faut que je vois avec l'hébergeur de mon site car le safe-mode du serveur php interdit l'exécution de shell_exec.
    @+
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  16. #16
    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 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par Maljuna Kris Voir le message
    quote ou apostrophe ' (#29 en hexa) par des caractères ‘ (#1F en hexa)
    D'où viennent ces codes ? Dans quelle norme ?
    39 en décimal ou 27 en hexadécimal, mais pas 29 (qui est une parenthèse en ASCII).
    Quant à 1f, je donne ma langue au chat.

    En UTF8, si tu veux rétorquer que le code unicode et son codage hexadécimal ne sont pas la même chose, je liste, ici, les caractères évoquables (jinventedesmots.com) :
    U0027: ' APOSTROPHE ou quote | hexa: 27
    U2018: ‘ GUILLEMET-APOSTROPHE CULBUTÉ (utilisé dans les messages précédents) | hexa: e28098
    U2019: ’ GUILLEMET-APOSTROPHE (caractère qui devrait être utilisé selon moi) | hexa: e28099

    source :
    http://hapax.qc.ca/Tableaux-10.0/U2000.pdf (ponctuation)
    http://hapax.qc.ca/Tableaux-10.0.htm (général)

    Attention quand même avec ces caractères exotiques. Ils sont souvent source d'arrachage de cheveux.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  17. #17
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    @Maljuna Kris : une chose que tu peux faire, pour limiter les protections et alternances de guillemets simples / doubles, c'est déclarer en entrée de awk des variables pour les guillemets.
    Dès lors qu'ils seront considérés au sens littéral dans le programme, ils pourront être remplacés par la variable correspondante.
    Par exemple, dans le cas ci-dessus, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v q1=\' '{sub(q1,"‘")}'
    Par contre, dans cet exemple, les guillemets doubles ne peuvent pas être remplacés par des variables, car ils sont interprétés par awk.
    Donc si tu es obligé d'encadrer le programme awk par des guillemets doubles, il faudra les protéger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v q1=\' "{sub(q1,\"\")}"

  18. #18
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Merci à tous, pour un retour sur ces forums, après quelques années “d'errance” dans d'autres activités, vous m'avez gâté, c'était super intéressant, vraiment.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  19. #19
    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 459
    Points
    13 459
    Par défaut
    [Hors sujet]

    Après vérification, "évocable" existe. C'est juste "c" et pas "qu".
    ÉVOCABLE, adj.

    DR. Qui peut être évoqué. C'est une affaire très évocable (Ac.).La femme écoute sur son mari des histoires évocables par la police correctionnelle (Goncourt, Journal,1876, p. 1109).

    [/Hors sujet]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  20. #20
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Et ça finit par fonctionner, en local.
    Il faut dire que j'invoque la commande au sein d'un script PHP et que, du coup, entre les échappement des \" et des \' il y a des différences avec le moment au je teste dans la console Linux.
    Bon, maintenant il faut que je vois avec l'hébergeur de mon site car le safe-mode du serveur php interdit l'exécution de shell_exec.
    @+
    Et pourquoi ne pas tout faire en php, puisque c'est le point d'entrée ?
    Cordialement.

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

Discussions similaires

  1. Problème de caractère spéciaux pour sed/awk en bash
    Par Etsuna dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 08/04/2019, 20h24
  2. Modification de variable pour SED
    Par vandman dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 12/10/2015, 15h54
  3. Regexp shell pour sed
    Par GLDavid dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 15/11/2006, 16h21
  4. [Regexp] pattern pour trouver des fichiers par exclusion d'extension
    Par mnementh64 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 07/09/2006, 10h34
  5. Réponses: 22
    Dernier message: 18/07/2006, 15h05

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