IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Détection de la première ligne vide à partir d'une ligne n


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Détection de la première ligne vide à partir d'une ligne n
    Bonjour à tous,

    J'ai un réel souci avec la détection d'une ligne vide dans un fichier de configuration du serveur samba /etc/samba/smb.conf. Je vous joins en pièce jointe le fichier que j'utilise (fichier type), dans le cas où vous n'auriez pas installé samba sur votre machine.

    Mon script fonctionne correctement sur n'importe quel fichier mais pas sur celui de samba. Le fonctionnement du script est de rechercher la chaine de caractères "[homes]", de récupérer le numéro de ligne correspondant et d'ajouter à la première ligne vide détectée en dessous de [homes] une chaine de caractères... Le problème est qu'il ne détecte pas la ligne vide et continue jusqu'à la fin du fichier.

    Voici mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
     
    fichier=/etc/samba/smb.conf
     
    numero=`sed -n "/\[homes\]/=" $fichier`
    texte=`sed -n "$numero p" $fichier`
     
    while [ -z "$texte" ]; do
            numero=$(( ${numero} + 1 ))
            texte=`sed -n "$numero p" $fichier`
            echo $numero
            echo $texte 
    done
     
    numero=$(( ${numero} + 1 ))
    sed -i $numero'iINSERTION_LIGNE\n' $fichier

    Pour info, la pièce jointe est en .txt mais en .conf à l'origine...
    Çà fait deux jours que je suis dessus et je n'ai pas trouvé la solution à ce bug
    Merci beaucoup pour votre aide.
    Fichiers attachés Fichiers attachés
    • Type de fichier : txt smb.txt (10,0 Ko, 106 affichages)

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    ton fichier est au format windows
    voir ici

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour ton aide...

    Alors j'ai procédé comme tu me l'as suggéré à convertir mon fichier smb.conf via la commande :

    find /etc/samba -type f -name "smb.conf" -exec sed -i -e "s/\x0D$//g" {} \;

    Mais l'erreur persiste... quand je lance de nouveau mon script, l'insertion de la chaine "INSERTION_LIGNE" se mets juste en dessous de [homes]. Du coup j'en déduis qu'il ne rentre pas dans ma boucle. Pourtant tout semple correcte à ce niveau. Pour info quand j'ajoute un cat -A /etc/samba/smb.conf à mon script pour voir les éventuels caractères cachés, j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [homes]$
    ^Icomment = Home Directories$
    ^Ibrowseable = no$
    ^Iwritable = yes$
    ;^Ivalid users = %S$
    ;^Ivalid users = MYDOMAIN\%S$
    $
    [public]$
    ^Icomment = Repertoire public$
    ^Ipath = /public$
    ^Iwritable = yes$
    ^Ipublic = yes$
    ^Ibrowseable = yes$
    Une idée?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/\[homes\]/{:z;n;/^$/! bz; s/.*/\tINSERTION_LIGNE\n/}' /etc/samba/smb.conf
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/\[homes\]/,/^$/{/^$/ s/.*/\tINSERTION_LIGNE\n/}' /etc/samba/smb.conf

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Tu penses que je ne reçois pas correctement ma chaine dans ma variable? ce qui empêcherait un bon fonctionnement au niveau de la boucle?

    car sinon je ne vois pas trop ce que tu voulais me faire comprendre via le lien précédent... désolé

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci Zipe31,

    j'ai ajouté -i pour faire la modification dans mon fichier. Du coup la commande devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\nINSERTION_LIGNE\n/}' $fichier
    et çà fonctionne parfaitement

    Maintenant faut passer en mode compréhension

    Merci à vous deux.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Juste une dernière question.

    Si maintenant la ligne que je souhaite ajouter n'est plus "INSERTION_LIGNE" mais une variable, comment dois-je modifié cette commande...

    J'ai essayé pas mal de possibilités mais je n'y parviens pas...

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par dammex Voir le message
    Maintenant faut passer en mode compréhension

    /\[homes\]/,/^$/{

    On s'électionne les lignes se trouvant entre "[homes]" et la 1ère ligne vide représentée par "^$", "^" ciblant le début de la ligne et "$" la fin, et on applique les commandes regroupées entre les accolades.



    /^$/
    Donc à l'intérieur de notre plage, on cible la ligne vide


    s/.*/\tINSERTION_LIGNE\n/

    On substitue la ligne dans sa totalité par une tabulation "\t", ce que tu veux comme texte et un saut de ligne (\n)

    }
    Fin du regroupement de commandes

    Citation Envoyé par dammex Voir le message
    Si maintenant la ligne que je souhaite ajouter n'est plus "INSERTION_LIGNE" mais une variable, comment dois-je modifié cette commande...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\n'"${variable}"'\n/}' $fichier

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    je ne vois pas trop ce que tu voulais me faire comprendre via le lien précédent
    si tu veux le faire en shell, c'est possible, mais il faudrait que tu apprennes comment le faire correctement => le lien !

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par dammex Voir le message
    Merci Zipe31,

    j'ai ajouté -i pour faire la modification dans mon fichier. Du coup la commande devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\nINSERTION_LIGNE\n/}' $fichier
    et çà fonctionne parfaitement

    Si maintenant la ligne que je souhaite ajouter n'est plus "INSERTION_LIGNE" mais une variable, comment dois-je modifié cette commande...

    J'ai essayé pas mal de possibilités mais je n'y parviens pas...
    J'ai pas essayé mais je dirais bien, au hasard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    motif='INSERTION_LIGNE'
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\n'"${motif}"'\n/}' $fichier
    C'est la concaténation de 3 chaînes:
    '/\[homes\]/,/^$/{/^$/ s/.*/\n' simples quotes pour ne pas traiter les "$" comme des variables shell (et autres caractères spéciaux)
    "${motif}" doubles quotes pour expanser les variables et ne pas couper la commande sed si la variable contient une espace.
    '\n/}' simples quotes pour ne pas traiter les caractères spéciaux ('\')

    De la joie des quotes en shell...
    )jack(

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Après une bonne nuit, retour sur le shell...

    J'ai testé votre solution qui s'avère fonctionner dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    variable="TEST"
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\n'"${variable}"'\n/}' $fichier
    par contre, si j'initialise ma variable de telle façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    variable="["$nom"]\n\tcomment = "$commentaire"\n\tpath = "$repertoire"\n\t"$utilisateur"\n\t"$permission"\n\n"
    sed -i '/\[homes\]/,/^$/{/^$/ s/.*/\n'"${variable}"'\n/}' $fichier
    j'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 94: option inconnue pour `s'
    En gros, la commande sed semble ne pas comprendre le substitute. Ce que je doute fortement. Pour moi, l'erreur vient de ma variable... pourant tout semble OK de ce côté là.

    Encore besoin de vous

  13. #13
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Il faut changer le séparateur par défaut de la commande de substitution qui est le slash et qui interfère avec le nom du répertoire.

    A la place il te faut mettre un caractère dont tu es sûr qu'il ne se retrouvera pas dans tes variables, dans mon exemple j'ai choisi le dièse (#).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/\[homes\]/,/^$/{/^$/ s#.*#\n'"${variable}"'\n#}' $fichier

  14. #14
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    OK tout fonctionne parfaitement.

    Grand merci pour votre aide.

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 740
    Points : 31 070
    Points
    31 070
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    A la place il te faut mettre un caractère dont tu es sûr qu'il ne se retrouvera pas dans tes variables, dans mon exemple j'ai choisi le dièse (#).
    Salut
    Et s'il y a des commentaires sur les lignes ???

    C'est dommage de passer par le shell alors que Python possède un configParser permettant de traiter/modifier/compléter de type de fichier mais bon, si le truc doit s'intégrer dans un outil plus complexe c'est compréhensible...

  16. #16
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Et s'il y a des commentaires sur les lignes ???
    Ben tu mets autre chose C'est d'ailleurs ce que je suggérais au début de ma phrase, les dièses étaient juste un exemple

    A la place il te faut mettre un caractère dont tu es sûr qu'il ne se retrouvera pas dans tes variables, dans mon exemple j'ai choisi le dièse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Suppression d'une ligne dont les cellules sont vides à partir d'une certaine colonne
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2015, 14h54
  2. Réponses: 6
    Dernier message: 08/04/2013, 18h36
  3. Réponses: 1
    Dernier message: 23/07/2011, 12h50
  4. Réponses: 1
    Dernier message: 03/01/2011, 15h01
  5. [VBA-E]Selection d'une ligne a partir d'une certaine colonne
    Par deathsurfer dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/06/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo