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

Linux Discussion :

sed et retour à la ligne


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut sed et retour à la ligne
    Bonjour,

    Voilà je cherche à remplacer des chaînes de caractères dans des dossiers et sous-dossiers sous Linux mais j'ai des problèmes lorsque des retours à la lignes viennent s'imiter dans la ligne que j'essaye de remplacer.

    J'ai donc tout d'abord essayer avec la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #find /var/www -type f -exec sed -i -e 's/\($[a-z0-9A-Z_]*\)\( *= *\)\(reqmysql *(.*) *;\)/\1\2\3\n\1->execute();/g' {} \;
    mais malheureusement comme expliquer au dessus, dès qu'il y a un retour à la ligne, ma commande ne s'exécute plus, sinon elle fonctionne parfaitement.

    J'ai donc essaye ensuite avec une autre commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /var/www -type f -exec sed -i -e 'N;s/\($[a-z0-9A-Z_]*\)\( *= *\)\(reqmysql *(\n*.*) *;\)/\1\2\3\n\1->execute();/g;P;D;' {} \;
    Cette fois-ci les retours à la ligne sont bien prit en compte mais là encore un problème survient, je ne sais pas pourquoi, mais la ligne que j'essaye de rajouter avec ma commande s'écrit parfois plusieurs fois.


    Si quelqu'un aurait une solution ou connaîtrais la raison de ce problème, je l'en remercie d'avance de bien vouloir m'en faire part.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    sed ... tout comme son frêre ed ... a été conçu pour travailler avec des lignes (séparées par des "line feed") peut-être serait-il utile d'expliquer (avec exemples) le but recherché ?

    Dès que les arguments de sed deviennent illisibles il est urgent de remettre le problème à plat.

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Dans les fichiers que j'ai a changer je peux tomber sur 2 cas distincts a remplacer :
    Tout d'abord le premier, plus simple et plus courant :
    $req_joueurs = reqmysql('SELECT * FROM 'joueurs_internationaux' ORDER BY nom');
    Là, la première commande que j'ai créer fonctionne parfaitement et effectue bien ce que je souhaite.

    Ensuite le deuxième que je peux rencontrer est le suivant :
    $req_param = reqmysql('
    SELECT * FROM 'droit' JOIN 'table'
    SELECT * FROM 'droit' JOIN 'table'
    WHERE 'module'="livredor" AND 'page'="signer";
    ') ;
    et c'est celui là qui me pose problème, car je n'arrive pas à gérer convenablement les retours à la ligne, une action est bien effectuer, mais parfois effectuer plusieurs fois, je ne sais pourquoi et j'arrive donc parfois à la chose suivante:
    $req_param = reqmysql('
    SELECT * FROM 'droit' JOIN 'table'
    SELECT * FROM 'droit' JOIN 'table'
    WHERE 'module'="livredor" AND 'page'="signer";
    ') ;
    $req_param->execute();
    $req_param->execute();
    $req_param->execute();
    Alors que je souhaiterais que la ligne d'execute() ne soit écrite qu'une seule fois.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    J'avais besoin de réviser awk. Je n'en suis pas un pro mais ceci devrait faire le travail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    awk 'BEGIN {mark=0;newOper=""}
          /^.*req_.*/ {mark=1; oper=$1}
          /^.*) *;.*/ {if (mark) newOper=oper"->execute();";mark=0}
         {
            print
            if (newOper != "")
                    {print newOper;newOper=""}
          }' $fichier

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Je t'ai donné la solution avec "sed" sur un autre forum, je la mets ici aussi à titre d'exemple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    :z
    /^\n*$.*) *;$/ {
    s/\($[^ ]*[^=]*\)\( *=[^)]*) *;\)$/\1\2\n\1->execute();/
        b
    }
    /) *;$/ !{
        N
        b z
    }
    À mettre dans un fichier texte (script.sed) et à lancer comme suit : sed -f script.sed fichier

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Encore merci zip, fonctionne parfaitement, par contre je n'ai pas trouver comment on met que le problème était résolu, je ne sais pas si cela existe sur ce forum.

    Donc voila, encore merci.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je refais une petite réapparition car le script fonctionne toujours, mais je n'arrive pas prévu cette éventualité, mais il ne s'exécute que sur les fichiers, pas les dossiers, donc dès qu'il rencontre un dossier celui ça s'arrête et ne s'effectue donc pas.

    J'ai essayer d'effectuer avec la commande find dans le terminal, mais il me dit qu'il me manque un paramètre pour exec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/radgeur/Bureau/dossier_test -type f -exec sed -i -f script.sed
    Si jamais vous auriez une solution à celà svp.
    Je continue à chercher de mon côté pendant ce temps.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    Le nom de chaque fichier est identifié par {}

    [QUOTE=radgeur;6757002]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/radgeur/Bureau/dossier_test -type f -exec sed -i -f script.sed {}

    Il faudra prévoir une redirection pour le résultat.

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Merci bien, effectivement j'avais utiliser cela lorsque j'exécutais mes commandes sur une seule ligne dans un fichier et j'avais oublier de reprendre la fin de ma commande.

    Encore merci à toi et zipe pour votre aide.

  10. #10
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Rebonjour à tous,

    Je pensais que le problème était résolu mais en faite pas du tout, lorsque j'éxecute le programme proposer par zipe il arrive qu'il bloque sur des fichiers et je ne sais pas pourquoi.

    J'ai essayer de l'écrire sur une seul ligne dans un fichier pour l'exécuter comme mes précédentes fonctions qui allaient parfaitement(voir les premières fonctions que j'ai écrites dans le premier message de ce post) mais je n'ai pas réussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/radgeur/Bureau/dossier_test/dossier_test2 -type f -exec sed -i -f ':z;/^\n*$.*) *;$/ {s/\($[a-z0-9A-Z_]*\)\( *= *\)\(reqmysql *(.*) *;\)/\1\2\3\n\1->execute();/;    b};/) *;$/ !{    N;    b z}' {} \;
    Je tiens à préciser que cette commande est exécuter sur un site plutôt conséquent former à l'aide d'un CMS.

    Désoler d'avoir encore besoin de solliciter votre aide.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    Blocage ? Il produit un message d'erreur ou non ?

    et avec le awk ci-dessus ?

  12. #12
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Oui lorsque je lance le programme sed proposer par zipe celui si arrête de s'exécuter.

    Et pour le programme awk j'avouerais que je ne connais pas du tout(donc je ne comprend pas comment celui-ci fonctionne) et que je n'ai absolument pas eu le temps de me pencher dessus.

    J'ai également penser à essayer de l'utiliser uniquement sur les fichiers php avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /var/www -type f -name "*.php" -exec sed -f script.sed {} \;
    pour voir si c'est les autres types de fichiers qui font planter mais je n'ai pas réussi.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    Le sed te semble plus clair que le awk ?

    Quel est le message d'erreur avec le sed ?

  14. #14
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    lorsque j'éxecute le programme proposer par zipe il arrive qu'il bloque sur des fichiers et je ne sais pas pourquoi.
    Il faudrait voir les fichiers en question, peut être est-ce dans leur format que cela gène la commande "sed"


    J'ai essayer de l'écrire sur une seul ligne dans un fichier pour l'exécuter
    Dans ce cas l'option "f" est inutile

    PS. sed n'est pas très verbeux en matière de message d'erreur

  15. #15
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Je ne sais pas du tout sur quel fichier cela pose problème et je ne sais pas comment on fait pour le savoir.

    Par contre j'ai voulu essayer d'executer mon script sur tout les fichiers php uniquement pour voir si c'était le faîte de tomber sur des images ou autre qui créer le bug, mais je n'ai pas réussi à faire fonctionner la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /var/www -type f -name "*.php" -exec sed -f script.sed {} \;

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    Si tu ne nous donnes ni message d'erreur, ni exemple de fichier qui bloque, nous ne pourrons que pleurer avec toi

    Sinon essayes juste avec le awk ... (il devrait marcher tel quel )

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 196
    Points : 358
    Points
    358
    Par défaut
    sinon le truc tout bête pour trouver le coupable déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    find /var/www -type f -name "*.php"| while read fichier
    do
     echo $fichier
     sed -f script.sed $fichier
    done

  18. #18
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Re-

    Rajoute le couple "-n" et "p" (affichage sur demande dans le script sed (ou "#n" en début de script plus exactement et "p")), puis lance ta commande comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /var/www -type f -name "*.php" -printf "\n%f\n" -exec sed -f script.sed {} \;
    Tu devrais te retrouver avec une ligne vide suivie du nom su fichier puis des lignes où la substitution a eu lieu.

  19. #19
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 16
    Points
    16
    Par défaut
    Avec la recherche des fichiers .php j'ai réussi à trouver ceux qui posaient probleme et à les supprimer, le programme fonctionne parfaitement sur un fichier test, il remplace parfaitement les fonctions reqmysql et rajoute bien la ligne souhaité derrière, quelque soit sa forme.

    Mais malheureusement lorsque je l'execute sur la totalité de mon site il y a des problèmes et je ne sais pas pourquoi, il s'effectue bien entièrement et ne s'arrête plus mais il n'arrive pas à s'effectuer tout le temps, dans la plupart des cas il ne s'effectue pas du tout, sur plus de 13.000 fois ou il doit s'exécuter, il y a seulement 250 qui sont fait.
    Voici un exemple de code ou il ne fonctionne pas

    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
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
     
    include "config.php";
     
    ##########################################
    ##  Récupère le nom du jeu et le score  ##
    ##########################################
    if (!empty($_POST['gname']))
    {
    	$game_name =htmlentities($_POST['gname'], ENT_QUOTES);
    }
    if (!empty($_POST['gscore']))
    {
    	$score = intval($_POST['gscore']);
    }
     
    if (!empty($_POST['game_name']))
    {
    	$game_name =htmlentities($_POST['game_name'], ENT_QUOTES);
    }
    if (!empty($_POST['score']))
    {
    	if ( $game_name == '501darts' )
    	{
    		if ( intval($_POST['score']) >100 )
    		{
    			$score = 0;
    		}
    		else
    		{
    			$score = 100 - intval($_POST['score']);
    		}
    	}
    	else
    	{
    		$score = intval($_POST['score']);
    	}
    }
     
    #####################
    ##  Recherche tri  ##
    #####################
    //ici il devrait s\'exécuter mais ne le fait pas
    $traitement_jeux = reqmysql('SELECT tri FROM `jeuxflash_jeux` WHERE nom_cach="'.$game_name.'"');
     
    while ($boucle = $traitement_jeux->fetch(PDO::FETCH_BOTH))
    {
    	$tri = $boucle ['tri'];
    }
     
    ######################################
    ##  Ajoute les scores dans la base  ##
    ######################################
    ?>

  20. #20
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Tu peux mettre ce fichier en pièce jointe, s'il te plaît, merci ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Retour à la ligne après une certaine balise (sed ?)
    Par openlife dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/04/2011, 20h32
  2. Caractère de retour à la ligne.
    Par Pari dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/03/2009, 10h59
  3. [JTextArea] Fichier et retour à la ligne
    Par eraim dans le forum Composants
    Réponses: 4
    Dernier message: 23/06/2004, 09h21
  4. [MFC] Retour à la ligne dans un CEdit
    Par Kant dans le forum MFC
    Réponses: 7
    Dernier message: 18/02/2004, 09h58
  5. Conserver les retours à la ligne
    Par arwen dans le forum ASP
    Réponses: 2
    Dernier message: 04/12/2003, 13h50

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