Interprétation d'un /* et */ par un bash

agyh81 -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
J'aurais un petit problème avec la programmation bash.
En fait, je développe un script qui traite des fichiers .c .cpp ... et pour chacun d'eux il liste (dans un log) les lignes qui ont plus de 100 caractères et les édite tronqués au 100ème caractère.
Le problème est que dans certains fichiers , les commentaire sont de cette forme /* */
J'ai l'impression que le shell interprète /* comme un: ls -d /*
et du coup lors que la ligne est tronquée, j'ai ceci :
ligne 3: /bin /cygwin.bat /cygwin.ico /etc /home /lib /tmp /usr /var this ALWAYS GENERATE ...
Alors que cette ligne est en réalité :
ligne 3: /* this ALWAYS GENERATE ...
Comment est ce que je pourrais faire pourque le shell accepte /* et */ sans les interprèter ..
Je vous remercie à l'avance pour votre aide précieuse.
Configuration: Windows XP
Internet Explorer 7.0

9 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    A quel niveau le caractère est interprété, commande ? variable ?
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    tu peux utiliser les apostrophes simples ou mettre un backslash avant les caractères
    encore mieux sera de nous montrer ton script ou la partie concernée ;-)
    0
    1. agyh81
       
      Salut,
      Je vous remercie pour vos réponses.
      Voici la partie du script concerné:

      #$1:le fichier concerné
      cat $1 | while read ligne
      do
      i=$(expr $i + 1)
      #Nombres de caractères de la ligne courante ET suppression des vides
      Nombre_Caracteres=`echo $ligne | wc -c | tr -d ' '`
      test=$Nombre_Caracteres
      if [ "$test" -gt 100 ]
      then
      #On récupère la ligne correspondante tronquée au 100ème caractères.
      ligneTronquee=`echo $ligne | cut -c1-100`
      message=`echo -e "ligne $i: $ligneTronquee ... "`
      echo $message >> $Log
      fi
      done

      Merci d'avance.
      0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    mettre des " pour que le shell n'interprète pas * contenu dans ligne
    ligneTronquee=`echo "$ligne" | cut -c1-100`
    0
  4. agyh81
     
    merci pour la réponse,
    En fait, j'ai essayé ligneTronquee=`echo "$ligne" | cut -c1-100` mais ça fonctionne dans certains cas et ne fonctionne pas dans d'autres cas (J'ai encore cette interprétation du /*)
    De plus , j'ai l'impression qu'il interpréte les * dans certaines séquences du genre "char * pTyPr" par exemple. par "01ReBuildAllUnmanaged.vbs 02ReBuildAllTech.vbs 03ReBuildAllBeans.vbs 04ReBuildConversion.vbs 05ReBuildAllAppliCaprice.vbs 06ReBuildAllAppliJazz.vbs...." ...
    Et même les ' ' ne fonctionnent pas.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    ne pas oublier celle ci
    Nombre_Caracteres=`echo $ligne | wc -c | tr -d ' '`
    0
  7. agyh81
     
    Tout à fait, je les ai tous mis entre guillemets.
    0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Je crois que ça dépend aussi de la version de bash et des options activées/désactivées de celui-ci (je pense à shopt et ses *glob") ;-\

    On peut avoir un bout d'un de tes fichiers histoire de tester ?
    0
  9. agyh81
     
    voici un bout de code :

    /* Détermine si un visuel peut rester ouvert à l'apparition d'un nouveau visuel*/
    virtual bool PeutResterOuverte(int id_nouveau_visuel);
    /* Précise les éléments de disposition des visuels*/
    /* debut Test de la CB */
    void CCB::RemplirListeCB(char *pTypPr);
    void CCB::RemplirListeFact(void);
    /* void ChargeListeFacturationModA(long pNoPrPCM, char * pTyPr);*/ /* GGRZ */
    long ChargeListeFacturationModP(long pNoPrPCM, char * pTyPr);
    void CCarteBleue::SetFlecheTri(void);
    void CCarteBleue::BasculeModA(void);
    /* debut Test de la CB */
    0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tiens tu peux essayer ça :
    #set -xv
    
    #$1:le fichier concerné
    sed 's|\*|\\\*|g' < "$1" | while read ligne
    do
    i=$(expr $i + 1)
    #Nombres de caractères de la ligne courante ET suppression des vides
    Nombre_Caracteres=`echo "$ligne" | wc -c | tr -d ' '`
    test="$Nombre_Caracteres"
    if [ "$test" -gt 100 ]
    then
    #On récupère la ligne correspondante tronquée au 100ème caractères.
    ligneTronquee=`echo "$ligne" | cut -c1-100`
    message=`echo -e "ligne $i: $ligneTronquee ... "`
    echo "$message" >> Log
    fi
    done
    0