Forum Programmation.shell Récupération d'une chaine dans un fichier

Posté par  .
Étiquettes : aucune
1
27
août
2012

Salut,

J'ai dans un fichier le nom d'une base de données que je voudrais mettre dans une variable, mon problème est que je n'arrive pas à récupérer juste le nom de celle-ci.

En utilisant un find et un grep je tombe sur la bonne ligne où se trouve ma base de données.

Le format de la ligne dans laquelle se trouve le nom de la bdd est :

'nom d'une variable'='//'lieu où se trouve ma bdd'/'nom de ma bdd'?options supplémentaires

Je tiens bien à préciser que tout est collé ensemble

Au début je pensais utilisé une regex pour commencer à saisir à partir du slash et finir au point d'interrogation mais il a commencé au premier slash et non au 3ième comme je l'aurai voulu.

Merci

  • # cut ou awk

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

    Considérons que tu as dans la variable $ligne la chaîne de caractère avec le format que tu mentionnes:

    $nom_database=`echo $ligne | cut -d '/' -f 2 | cut -d '?' -f 1`

    $nom_database=`echo $ligne | awk -F '/' '{print $2}' | awk -F '?' {print $1}`

    Fuse : j'en Use et Abuse !

    • [^] # Re: cut ou awk

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

      J'avais pas fais attention au double slash devant => Décalage des indices de 1 !

      $nom_database=echo $ligne | cut -d '/' -f 3 | cut -d '?' -f 2

      $nom_database=echo $ligne | awk -F '/' '{print $3}' | awk -F '?' {print $2}

      Fuse : j'en Use et Abuse !

  • # avec awk

    Posté par  . Évalué à 2.

    Si ton format ne bouge jamais, en se basant sur les '

    echo "'nom d'une variable'='//'lieu où se trouve ma bdd'/'nom de ma bdd'?options supplémentaires" |awk -F "'" '{print $8}'
    
    
  • # Récupération réussie

    Posté par  . Évalué à 2.

    Ça marche super bien avec cut.

    Merci beaucoup déjà pour la rapidité de vos réponses ainsi que leurs clartés.

    • [^] # Re: Récupération réussie

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

      Les solutions proposées fonctionnent toutes j'en suis sur, mais je viens quand même faire mon extrémiste :

      • Les deux solutions de "ze_lionix" comporte trop de pipe à mon gout (oui j'ai des gouts de m**** mais on se refait plus à mon age!). Et mention spéciale pour le double awk en cascade : non quand-même ! (que les choses soient claires : je ne connais pas bien awk, alors je ne prétend pas donner de leçons ici hein.) Une remarque classique pour ce type d'exemple : awk est un langage, il ne devrait pas y avoir besoin de le mixer avec un autre (du bash dans ce cas là), c'est un peu comme piper du bash vers du perl selon moi.

      • La solution de littlebreizhman est propre, rapide claire et efficace : parfait, à ta place j'aurai opté pour celle-ci. Tant qu'a faire appel à un programme externe autant qu'il soit optimum.

      Voici une solution qui n'est ni rapide (quoique) ni claire (quoique_2) ni efficace (pas de quoique là) mais propre, elle peut paraître surdimensionnée mais elle à un avantage :
      C'est du bash pur!, la voici :

      while IFS="'" read _ _ _ D _ ; do
        echo "$D"
      done <<<"$(echo "//'lieu où se trouve ma bdd'/'nom de ma bdd'?options supplémentaires'")"
      
      

      Voilou, c'était juste pour ajouter un peu d'eau à ce moulin, et puis j'aime bien les petites questions comme ça (je manque de bash a mon taff)

  • # bien gérer sa gourmandise

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

    Au début je pensais utilisé une regex pour commencer à saisir à partir du slash et finir au point d'interrogation mais il a commencé au premier slash et non au 3ième comme je l'aurai voulu.

    Ça dépend de comment tu écris ta regexp :

    $ echo "'nom d'une variable'='//'lieu où se trouve ma bdd'/'nom de ma bdd'?options supplémentaires" | sed -r 's,^.+/(.+)\?.*$,\1,'
    'nom de ma bdd'
    
    

    Les quantificateurs sont gourmands et utilisés de gauche à droite. Avec certaines saveurs d'expressions rationnelles, il existe cependant des versions non gourmandes des quantificateurs. Voir par exemple perlre(1).

    Les mots clefs sont "quantifier" et "greedy".

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Avec SED ou rien!

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

    Voilà un filtre (où le [& doit être remplacé par un [[ et le &] par un ]] pour pallier à un petit problème de dacode.

    sed -n -e 's@\([&:alnum:&]*\)=\(/.*\)/\([^/]*\)?\(.*\)@\1|\2|\3|\4@p'
    
    

    Si tu lui donnes à manger

    echo "'nom d_une variable'=//'lieu où se trouve ma bdd'/'nom de ma bdd'?options supplémentaires"

    il te répond

    'nom d_une variable'|//'lieu où se trouve ma bdd'|'nom de ma bdd'|options supplémentaires

    et tu n'as plus qu'à jouer avec AWK '-F|' pour consulter la table produite par un pipe de ton fichier dans le filtre précenent. (Qu'évidemment tu cales dans une fonction autonome avec un nom qui vabien.)

Suivre le flux des commentaires

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