Forum Programmation.shell substitution dans un fichier

Posté par  .
Étiquettes : aucune
0
14
nov.
2004
Bonjour, je cherche une commande pour faire une substitution de chaîne dans un fichier.

en fait je cherche à substituer plusieurs chaines d'un même coups , voici un exemple...

imaginons un fichier :
fichier : connexion.inc.php.modele
<?php
$cnx=mysql_pconnect("#SERVER#","#USER#","#PASS#")or die("prout!");
>

et maintenant un autre fichier dans le quel serait specifié mes valeurs, par exemple :
fichier : vars

#SERVER#=abcd
#USER#=bob
#PASS#=xyz


J'aimerais bien trouver une commande qui prenne mon fichier d'entrée connexion.inc.php.modele me substitue les chaines du fichier vars et me donne un autre fichier connexion.inc.php par exemple.

quelqu'un peut'il m'aider a trouver cette commande magique ?

merci.
  • # And the winner is ... perl

    Posté par  . Évalué à 2.

    Perl est ton ami
    Tu peux construire le script assez facilement.

    Le module Config::General te permet de parser ton fichier var pour en sortir un hachage qui contient tes valeurs.

    Tu n'a plus qu'a faire les substitutions dans le second fichier :

    exemple de fichier de substitution
    -------------------------------------------
    #!/usr/bin/perl

    use Config::General;

    my $input_filename = "connexion.inc.php.modele";
    my $output_filename = "connexion.inc.php";

    my %config=ParseConfig(vars);

    ## Lecture de l'entree
    open(INPUT,$input_filename);
    my @TABLEAU = ;
    close (INPUT);

    ## Ecriture de la sortie
    open (OUTPUT,"> $output_filename");
    foreach $ligne (@TABLEAU) { # Pour chaque ligne
    foreach $variable (keys %config) { # pour chaque variable
    s/$variable/$config{$variable}/g; # on substitue
    }
    print (OUTPUT,$ligne);
    }

    close (OUTPUT); # fini :)
    -----------------------------------------------------

    Hope it helps :)

    PS : jsuis sur que ça peut se faire en deux fois moins de lignes en obfuscated perl :)
    • [^] # Re: And the winner is ... perl

      Posté par  . Évalué à 4.

      PS : jsuis sur que ça peut se faire en deux fois moins de lignes en obfuscated perl :)

      Euh, pareil en php hein... Le monsieur n'a pas besoin de changer de langage pour faire ce que tu dis.

      Si tu désires réellement avoir des variables de conf dans tes scripts php, tu peux au choix :

      1/ faire en php ce que Swirly te propose en perl (les fonctions strtr() et eval() peuvent t'y aider), mais c'est pas très propre, vraiment...

      2/ Faire un fichier php avec des variables de configuration, et un simple include() pour les appliquer (c'est la méthode la plus couramment employée):

      <?php
      //--------------------------
      // config.php
      //--------------------------

      $config=array();

      $config['mysql_server']="localhost";
      $config['mysql_user']="root";
      $config['mysql_password']="ChangeMe";

      // etc....
      ?>





      <?php

      //--------------------------
      // index.php
      //--------------------------
      require_once('config.php'); // c'est comme include()

      $cnx=mysql_pconnect( $config['mysql_server'] ,$config['mysql_user'] , $config['mysql_password'] ) or die ("prout!");


      // etc....
      ?>

      3/ Tu peux aussi faire une variante de ce que tu dis, en stockant tes variables dans un fichier INI. la fonction parse_ini_file() de php te mâche le boulot ... Mais si tu choisis cette voie, attention à la sécurité ! (le fichier ini ne doit pas pouvoir être ouvert via le web, donc il faut le placer dans un répertoire à part avec le .htaccess qui va bien).
      • [^] # Re: And the winner is ... perl

        Posté par  . Évalué à 1.

        merci a vous deux pour vos deux reponses,

        Swirly, je ne connais pas le perl, mais bon je vais faire un copié collé pour voir :).. mais j'aurais bien aimé que les fichiers soient pris sur la ligne de commande et non en dur dans le script. comme ca :
        $commandemagique -in connexion.inc.php.model -param var -out connexion.inc.php

        Tipiak, c'est tout a fait juste, je peux tres bien le faire en php, j'y avais d'ailleur pensé (un petit split sur le contenu de 'vars' pour chopper les parern, un bête file pour 'lire' le fichier modele, et un substr_replace (ou un ereg_replace)... bon, bref ouais ca doit se faire, mais je pensais qu'on pouvais trouver une comande unix/linux qui faisait dejà celà... (ou même que j'allais enfin a masteriser sed/awk :) )

        Une remarque, a propos de $config['mysql_server']="localhost";.... (ou même avec un define ou peu importe).. je suis contre...
        en fait, mon fichier connexion.inc.php est déjà un fichier à inclure (oui j'utilise @require_once qui est bien mieux) comme son nom l'indique (le .inc.php).. donc je ne vois pas l'interret d'inclure un fichier qui contiendrait les identifiant... (un etage de plus, autant les mettre directement dasn mon fichier :) )

        La raison de tout ca ?
        je veux pouvoir deployer un projet sur des machines, en lancant un script (comme un make .. d'ailleur ca sera sans doute un make...) il est hors de question d'editer un fichier php du projet pour y mettre la base de donée/username/password...
        el but est donc de finir de construire des fichier php automatiquement.

        bon, ben... sauf si qqun connais une commande directe, ou avec du sed... he ben je vais la faire en php...
        merci.
  • # le préprocesseur de gcc

    Posté par  (site web personnel) . Évalué à 3.

    a la place de #SERVER#=abcd met #define SERVER abcd et utilise l'option -E de gcc ou carement cpp pour le faire.
    tu fait un :
    $> cpp mesdefs.inc.php monfich.php.modèle > res.php
    • [^] # Re: le préprocesseur de gcc

      Posté par  . Évalué à 1.

      C'est vachement original !
      en changeant la syntaxe de mon fichier de paramettre ... (oui la syntaxe j'y suis pas particulierement attaché)
      Bravo pour l'originalité, j'y avais pas pensé.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.