Filtrer une variable

Résolu
Bonjour,

Je crois comprendre que les filtres grep, sort, cut, sed ... opèrent seulement sur des fichiers??

Que faire si on veut filtrer une variable??
contrôler si dans une variable il y a un motif et retourner une reponse.
(je suis novice!!...)
Ex
varx="Boire bcp alcool nuit à la sante"

grep "alcool" $varx

ou

sed s/alcool/biere/g $varx

5 réponses

  1. Modérateur
    echo $varx | grep "alcool"
    0
    1. ok! merci!
      0
    2. si on ne desire pas afficher le résultat.
      juste metttre dans une variable
      0
  2. Contributeur
    Salut,

    Ou aussi avec une redirection "<<<" :

    $ echo "${vary}"
    Boire bcp alcool nuit à la sante
    
    $ echo "${varx}"
    Boire
    bcp
    alcool
    nuit
    à
    la
    santé
    
    $ grep 'alcool' <<<"${vary}"
    Boire bcp alcool nuit à la sante
    
    $ grep 'alcool' <<<"${varx}"
    alcool
    
    $ sed 's/alcool/bière/' <<<"${vary}"
    Boire bcp bière nuit à la sante
    
    $ sed 's/alcool/bière/' <<<"${varx}"
    Boire
    bcp
    bière
    nuit
    à
    la
    santé
    
    $

    ;-))
    0
    1. je pas compris cette methode
      0
    2. Contributeur
      Au lieu de faire :

      cat $variable | grep 'motif'


      On envoie directement la variable grâce à la redirection "<<<" sans passer par un "pipe" ( | ).

      grep 'motif' <<< $variable
      0
    3. Mais il faut deja donner à grep la chaine de caractère qu'il doit traiter.

      J'ai par exemple:

      maVar1="Boire bcp alcool nuit à la sante"

      et je veux mettre dans maVar2, maVar1 mais sans le mot "alcool" : donc

      maVar2="Boire bcp nuit à la sante"

      coment faire??

      2eme cas

      si je veux juste savoir si j'ai "alcool" dans maVar1. comment faire?
      0
    4. Contributeur
      1er cas :

      $ maVar1="Boire bcp alcool nuit à la sante" 
      
      $ maVar2=$(sed 's/alcool //' <<< $maVar1)
      
      $ echo $maVar2
      Boire bcp nuit à la sante
      


      2ème cas : On teste le code retour ($?). Si égal à zéro (0) c'est bon, sinon si égal à un (1) c'est pas bon

      $ grep 'alcool' <<< $maVar1
      Boire bcp alcool nuit à la sante
      
      $ echo $?
      0
      
      $ grep 'biere' <<< $maVar1
      
      $ echo $?
      1
      
      $
      0
    5. Ok Man !! Merci!

      C'est tres clair
      Merci encore!
      0
  3. salur,

    en bash aussi
    [[ $vary =~ (alcool) ]] && echo "${BASH_REMATCH[1]}"
    0
    1. [wilson@wilsonHP mybin]$ var1="boire bcp alcool nuit a la sante"

      [wilson@wilsonHP mybin]$ echo $var1 | grep "alcool"
      boire bcp alcool nuit a la sante
      [wilson@wilsonHP mybin]$ grep 'alcool' <<< $var1
      boire bcp alcool nuit a la sante

      mais var1 ne change pas
      voici avec sed je peux le changer

      [wilson@wilsonHP mybin]$ echo $var1 | sed s/"alcool "//g
      boire bcp nuit a la sante

      Mais comment mettre ce nouveau résultat dans une autre variable, ou meme dans la meme variable en ecrasant son ancien contenu

      Aussi si je veux juste savoir dans un script bash, si cette variable contien le mot 'alcool' ou pas, qui declenchera une autre commande.

      genre :

      if [ ! echo $var1 | sed s/"alcool "//g -eq $var1]; (je sais qu'ici c'est mal écrit)
      then
      ....
      0
      1. Je suis entrain d'ecrire un petit script tout bete
        mais il bloque je crois au niveau de la partie en gras en disant:
        zz.sh: ligne41: -120 : commande introuvable
        sur gedit je ne peux pas trouver les lignes des messages d'erreur.
        pouvez vous jetter un coup d'oeil svp.

        #! /bin/sh
        # nom du fichier => zz.sh
        showrep=0

        echo "Vous voullez savoir à quel jour de la semaine correspond une date?"
        PS3="Entrez le numéro de votre date choisie -> "

        select ladate in "aujourd'hui" "Une date quelquonque" "Votre date d'anniverssaire" "Sortir du programme";

        do
        if [ -z "$ladate" ];
        then
        echo "Erreur: entrez un numéro coorespondant aux dates proposées svp." 1>&2

        elif [ "$REPLY" -eq 1 ];

        then
        Kel="la date d'aujourd'hui"
        dateChoi=$(date +%s)
        dc=$(date "+%D")
        showRep=1

        elif [ "$REPLY" -eq 4 ];:

        then
        echo "Bye!"
        break

        else
        Kel="Une date quelquonque"
        if [ "$REPLY" -eq 3 ];
        then
        Kel="Votre date d'anniverssaire"
        da="d'anniverssaire"
        fi

        echo "Vous désirez savoir à quel jour de la semaine correspond "$Kel
        echo "Veuillez saisir l'année $da: "; read annee

        Actualyear=$(date "+%Y")
        PlageYear=let $[ActualYear - 120]
        while [ $annee -gt $Actualyear ]|| [$annee -lt $PlageYear];
        do
        echo "Année $da saisie incorrecte. Ressayez: "
        read annee
        done

        echo "Veuillez saisir le mois: "
        read mois
        while [ $mois -gt 12 ] || [ $mois -lt 1 ];
        do
        echo "Mois $da saisi incorrect. Ressayez: "
        read mois
        done

        echo "Veuillez saisir le jour: "
        read jour
        while [ $jour -gt 31 ] || [ $jour -lt 1 ] || [ $jour -gt 29 ] && [ $jour -eq 2 ] || [ $jour -eq 30 ] && [ !$mois -eq 2 ];
        do
        echo "Jour $da saisi incorrect pour le mois $mois. Ressayez: "
        read mois
        done

        dateChoi=$(date -d "$annee-$mois-$jour 0:0:0" +%s)
        dc="$jour/$mois/$annee"
        showRep=1

        fi

        if [ $showRep -eq 1 ];
        then

        echo "Le jour de la semaine coorespondant à $dc est: " $(date -d @$dateChoi "+%A")

        fi
        echo
        done
        0
      2. J'ai trouvé les erreurs
        j'ai écris
        PlageYear=let $[ActualYear - 120]
        au lieu de
        PlageYear=$[Actualyear - 120]
        0
    2. PlageYear=let $[ActualYear - 120]
      ça ce n'est pas correct.
      PlageYear=$((ActualYear - 120))

      et là
      while [ $annee -gt $Actualyear ]|| [$annee -lt $PlageYear]; 
      il manque un espace à gauche du ou (||).
      tu devrais privilégier l'usage de 'case', ce serait plus clair.

      ps: puisque tu changes de sujet, ouvre un nouveau sujet !
      0
      1. merci
        0