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 :

Remplacer ou ajouter une ligne dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut Remplacer ou ajouter une ligne dans un fichier
    Bonjour,

    Je voudrais forcer une ligne spéciale dans un fichier ou, si elle n'existe pas, l'ajouter. Je le fais pour l'instant de manière "verbeuse", mais existe-t-il un truc en une commande? Voici ce que je fais actuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    newLine='xyz...'
    sel='xyz'
    if grep ^$sel fichier
    then
      sed -i "s/^$sel.*/$newLine/" fichier
    else
      echo "$line" >> fichier
    fi
    J'ai supprimé tous les détails inutiles du code...

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Teste ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed '/^$sel/ s/^$sel.*/$newLine/g' fichier || echo "$line" >> fichier

  3. #3
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Merci Winnt pour ta réponse.

    Mais plusieurs remarques:

    • J'imagine qu'il faut des double-quotes " plutôt que des simples ', parce que sinon les $x ne sont pas remplacés par leurs valeurs respectives.
    • La commande sed renvoie toujours 0 lorsque son fonctionnement est correct, qu'il y ait eu des sélections ou non. Donc le ou logique || ne sera jamais parcouru. La commande grep, elle, retourne 1 lorsque rien n'est trouvé.

    J'ai pourtant l'impression que sed peut aider. Au mieux, j'ai un awk, qui supprime en plus les lignes multiples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v l=$line -v s=$sel '{if ($1 == s) {if (ok != 1) {print l; ok = 1}} else {print}}' fichier > fichier.nouveau

  4. #4
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut jmelyn,

    Remarques pertinentes en effet.
    A ma décharge je suis au boulot et pas linux sous la main.
    Je regarderai ce soir, si j'ai le temps, pour te proposer une solution

  5. #5
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Hein? Quoi? Comment? Plait-il? Mais comment peut-on travailler sans Linux?

    À c'soir...

    PS: avec Linux allumé à la maison, une adresse dynDNS qui va bien, le port 22 ouvert dans le firewall, le service fail2ban qui tourne, il est tout-à-fait possible de s'y connecter depuis le boulot ...

  6. #6
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    @jmelyn
    Sans doute mais pour installer ce qu'il faut sur le poste windows j'ai besoin d'être administrateur du poste ce que je ne suis pas
    C'est dur la vie de simple grouillot de base dans une administration

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winnt Voir le message
    @jmelyn
    Sans doute mais pour installer ce qu'il faut sur le poste windows j'ai besoin d'être administrateur du poste ce que je ne suis pas
    C'est dur la vie de simple grouillot de base dans une administration

    Heu tu n'as pas besoin d'installer quoi que ce soit. Un simple client ssh suffit et tu peux te connecter en remote sur un serveur linux.

    http://www.chiark.greenend.org.uk/~s.../download.html

  8. #8
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    @Mygale1978
    En traversant le proxy et le firewall dont je ne doute pas que le port 22 ne soit bloqué ou autre joyeusetés.
    Tout cela pour simplement un petit test sur une commande de temps à autre.
    Sans compter que si l'un des admins s'en aperçoit ca risque de chauffer.
    Ca n'en vaut pas le coup.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winnt Voir le message
    @Mygale1978
    En traversant le proxy et le firewall dont je ne doute pas que le port 22 ne soit bloqué ou autre joyeusetés.
    Tout cela pour simplement un petit test sur une commande de temps à autre.
    Sans compter que si l'un des admins s'en aperçoit ca risque de chauffer.
    Ca n'en vaut pas le coup.

    Tu peux librement modifier le port e ton serveur ssh (80 ou 443 par exemple -> la connexion vers ces ports sera tranparante si tu as accès à internet au bureau et feront croire aux admins que tu surfes simplement sur le net)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 455
    Points
    19 455
    Par défaut
    Oui !!! sed le fait :
    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
    17
    18
    19
    20
    21
    var=("bla bla" "cra cra" "ella ella")
    printf '%s\n' "${var[@]}" > fichier.test
    old="xyz"
    newline="xyz..."
    sed '/^'"$old"'/t SUITE $a\'"$old"'
    :SUITE s/'"$old"'.*/'"$newline"'/;N' fichier.test
    bla bla
    cra cra
    ella ella
    xyz
     
    var=("bla bla" "cra cra" "xyz zyx" "ella ella")
    printf '%s\n' "${var[@]}" > fichier.test;
    old="xyz"
    newline="stu..."
    sed '/^'"$old"'/t SUITE $a\'"$old"'
    :SUITE s/'"$old"'.*/'"$newline"'/;N' fichier.test
    bla bla
    cra cra
    xyz...
    ella ella
    Non, mais...

    (source : http://student.northpark.edu/pemente/sed/ifelse.txt)

  11. #11
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    N_BaH moi qui voulait étaler ma science

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 455
    Points
    19 455
    Par défaut

  13. #13
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Ti'djou... c'est pas d'une clarté cristalline. Je sais que "sed, c'est bien!", mais y'a plus limpide. Je crois que je vais rester avec mon awk, très légèrement retouché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk -v l=$line -v s=$sel '
    {
      if ($1 ~ s) {if (!ok) {print l; ok = 1}}
      else {print}
    }'
    C'est aussi beau qu'un cigare cubain roulé sur la cuisse doucement veloutée d'une magnifique autochtone...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 455
    Points
    19 455
    Par défaut
    C'est moi, ou ta commande awk n'ajoute pas de ligne à la fin du fichier si le motif est absent du fichier ?

  15. #15
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Ben heureusement que t'es là biloute (zut, mes origines ressortent ). Me manquait un bout de code à ma deuxième intervention, ensuite j'ai simplement repris le code. Voici donc le code complet avec le bout manquant (en général, c'est le meilleur...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk -F : -v l=$line -v s=$sel '
    {
      if ($1 ~ s) {if (!ok) {print l; ok = 1}}
      else {print}
    }
    END {if (!ok) {print l}}' fichier
    Pour résumer son action:

    • si la sélection ($sel) n'existe pas, la ligne est ajoutée à la fin,
    • si la sélection existe une seule fois, la ligne est écrasée,
    • si la sélection existe plusieurs fois, les autres lignes sont supprimées.

    Cool, non?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 582
    Points : 19 455
    Points
    19 455
    Par défaut
    Très cool, et très clair !!
    si la sélection existe plusieurs fois, les autres lignes sont supprimées
    Voici quelque chose qu'il serait bien tortueux de réaliser avec sed ^^

  17. #17
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bon, sed ne fait pas tout (le thé vert le matin, par exemple). Mais j'aimerais bien que awk ait l'option -i (in-situ) de sed. Je reprends encore un peu le code pour qu'il soit plus lisible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk -v l=$line -v s=$sel '
    {
      if ($1 ~ s) {if (!dejaFait) {print l; dejaFait = 1}}
      else {print}
    }
    END {if (!dejaFait) {print l}}' fichier

  18. #18
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Salut jmelyn,

    Remarques pertinentes en effet.
    A ma décharge je suis au boulot et pas linux sous la main.
    Je regarderai ce soir, si j'ai le temps, pour te proposer une solution
    Tu peux installer Cygwin sur une clé USB... et tu as toutes les commandes du shell à portée de la main

  19. #19
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    @al1_24

    Mais je suis "censé" bosser au boulot

Discussions similaires

  1. ajouter une ligne dans un fichier excel en vb.net 2010
    Par AlexLyon dans le forum VB.NET
    Réponses: 2
    Dernier message: 08/08/2011, 20h35
  2. Ajouter une ligne dans 1000 fichiers HTML
    Par jesuismoi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/11/2010, 18h02
  3. Réponses: 7
    Dernier message: 31/10/2010, 22h29
  4. [DOM]ajouter une ligne dans un fichier xml
    Par aroua dans le forum APIs
    Réponses: 1
    Dernier message: 21/04/2008, 17h25
  5. ajouter une ligne dans un fichier
    Par e-medi dans le forum C
    Réponses: 7
    Dernier message: 21/09/2007, 10h40

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