Galere sur script shell

Résolu
vieurou Messages postés 73 Statut Membre -  
vieurou Messages postés 73 Statut Membre -
salut ,

j'ai ça dans un script :

 
 for i in `seq 0 32`;
  do
	if [ "cat $file | grep r${i} | wc -l" -gt "1" ]
	then
		sed -i -e '{/\<hoplahop\>/}{a}\<int r'${i}'\n>' $file	
	fi
  done


ce code devrait trouver dans le texte toute les occurence de r+un_chiffre (par exemple r0, r1, r2..., r32.) puis me rajouter dans ce texte juste en dessous de la ligne contenant "hoplahop" :
 int r0;
int r1; 
...


mais cela ne fonctionne pas

merci de votre aide.
Configuration: Linux
Firefox 2.0.0.6

22 réponses

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

    Essaie plutôt comme ça :
    if [ "$(cat $file | grep r${i} | wc -l)" -gt "1" ]
    ;-))
    0
  2. vieurou Messages postés 73 Statut Membre 2
     
    merci,
    cependant ma commande sed ne fonctionne pas

    j'ai essayé egualement
    sed -i -e '/\<hoplahop]\>/a/\<\nint r'${i}'\>/' $file

    mais ça ne fonctionne pas non plus , je n'ai plus de message d'erreur mais les declarations "int r0; int r1;..." ne se font pas
    j'ai du me tromper dans la syntaxe, mais où???
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaie ça dans un shell et dis-moi si ça passe :
    i="1"; sed  '/\<hoplahop\>/a\\nint r'${i}'' ton_fichier
    ;-))
    0
  4. vieurou Messages postés 73 Statut Membre 2
     
    ben ça fonctionne dans le terminal , une fois mis dans le script ça ne fonctionne plus...
    j'ai mis un echo de la variable $i et elle s'affiche bien , donc je passe bien dans ma boucle
    a partir de là , .. ben je sais pas
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. vieurou Messages postés 73 Statut Membre 2
     
    c'est bon , ça mache, il me manquer dans le script un espace entre le a et l'antislash
    sed -i -e  '/\<hoplahop\>/a \\nint r'${i}'' mon_fichier


    encore merci pour tout
    0
  7. vieurou Messages postés 73 Statut Membre 2
     
    encore un autre petit truc , je voudrai que le
     if [ "$(cat $file$tmp0 | grep r${i} | wc -l)" -gt "0" ]
    ne soit effectuer que sur le code non commenter ,
    avec sed je fais ça :
     /\/\*/,/\*\//!
    (merci jipicy)
    je ne pense pas que ça fonctionnerai avec le if, donc ma question est : comment faire?
    0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaye comme ça :
    if [ "$(sed '/\/\*/,/\*\//d' $file$tmp0 | grep r${i} | wc -l)" -gt "0" ]
    ;-))
    0
  9. vieurou Messages postés 73 Statut Membre 2
     
    impecable , ça marche ...heureusement que t'es là

    euh , avec mon
     sed -i -e  '/\<hoplahop\>/a \\nint r'${i}'' mon_fichier
    , je veut le modifier pour qu'a la place de me declarer int r$i il me declare int r($i+1)
    j'ai essayé
     sed -i -e  '/\<hoplahop\>/a \\nint r'${i+1}'' mon_fichier            #marche pas
     sed -i -e  '/\<hoplahop\>/a \\nint r'${i}+1'' mon_fichier               #marche pas non plus 


    comment faire pour ajouter un à ma variable???
    0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    L'incrémenter avant :
    ((i++))
    sed -i -e  '/\<hoplahop\>/a \\nint r'${i}'' mon_fichier
    ;-))
    0
  11. vieurou Messages postés 73 Statut Membre 2
     
    ben en faite , je doit garder i car je dois l'utiliser donc je peut pas l'incrementer avant, j'ai essayer de crée une variable j, mais j'arrive pas
    if [ "$(sed '/^[ ]*#\|#\|^$\|^\n*$/d' $file | grep c${i} | wc -l)" -gt "0" ]
    		then
    			j="$i++"
    			sed  -i -e '/\<hoplahop\>/a \temp c'${i}' = variable['$j']' $file  
    	fi
    

    il me donne 1++ a la place de 2
    lorsque a la place je met j=((i++)) il me met une erreur : Syntax error: "(" unexpected (expecting "fi")
    ???

    un autre petit souci : avec le code d'au dessus , outre le souci d'incrementation , lorsqu'il croise par exemple "c0.x" il ne me le comptabilise pas , il ne me compte que les "c0" san rien d'autre derriere (c0 par exemple peut etre c0.x, c0.y ou c0.z)

    encore merci pour toute ton aide
    0
  12. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    j=$(($i+1))
    0
  13. vieurou Messages postés 73 Statut Membre 2
     
    cool , ça fonctionne

    et pour un autre petit souci : avec le code d'au dessus , lorsqu'il croise par exemple "c0.x" il ne me le comptabilise pas , il ne me compte que les "c0" san rien d'autre derriere (c0 par exemple peut etre c0.x, c0.y, c0.z ou encore etre negatif comme par exemple -c0.x, -c1.z)

    une idée?
    0
  14. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben normalement il devrait les prendre en compte, sans tenir compte justement de ce qui se trouve après dans la mesure où ce n'est pas demandé implicitement dans la syntaxe de "grep" :-\

    Désolé là je vois pas ;-(
    0
  15. vieurou Messages postés 73 Statut Membre 2
     
    tu as donc une limite !!! lol

    en tout cas je te remercie encore de toute cette aide

    un tres tres grand MERCI
    0
  16. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben de rien ;-))
    0
  17. vieurou Messages postés 73 Statut Membre 2
     
    ben c'est bon en fait , c'est moi qui bug
    avec
    if [ "$(sed '/^[ ]*#\|#\|^$\|^\n*$/d' $file | grep c${i} | wc -l)" -gt "0" ]
    

    je ne passais pas par les lignes contenant un # , j'ai rectifier et ça a l'air bon

    donc en fait t'as pas de limite...
    0
  18. vieurou Messages postés 73 Statut Membre 2
     
    rererere...

    encore autre chose :
    avec
    if [ "$(sed '/^[ ]*#\|^$\|^\n*$/d' $file | grep c${i} | wc -l)" -gt "0" ]
    then
    			j=$(($i+1))
    			sed  -i -e '/\<hoplahop\>/a \temp c'${i}' = variable['$j']' $file  
    	fi

    je voudrait faire la meme chose mais sans que cela me compte les c qui sont commenté
    c'est à dire que si j'ai
    blablabla    #blablabla c11
    bla bla c1   #blablabla
    il ne me trouve pas le c11, mais me trouve toujour le c1

    une idée???
    0
  19. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaye avec ça :
    f [ "$(sed '/^[ ]*#\|^$\|^\n*$/d' $file | sed '/#[^\^#]/{s/#.*//}' | grep c${i} | wc -l)" -gt "0" ]
    ;-))
    0
  20. vieurou Messages postés 73 Statut Membre 2
     
    impeccable , merci encore

    est ce que tu peut me décortiquer vite fait cette nouvelle commande s'il te plaît
    0
  21. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    en fait la commande sed te permet de jongler avec les expressions régulières (regex)

    pour mieux comprendre je pense que tu dois les étudier un peu.
    https://www.funix.org/fr/unix/expr-sed.htm
    a savoir qu'il y a plusieurs utilitaires qui permettent d'exploiter les regex, personnellement je préfère Perl, qui offre une implementation très puissante des regex

    en bref, chaque utilitaire a ses particularités en ce qui concerne le traitement des regex
    0
  • 1
  • 2