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 :

Écrire une ligne dans un fichier en spécifiant son numéro de ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2009
    Messages : 16
    Par défaut Écrire une ligne dans un fichier en spécifiant son numéro de ligne
    Bonjour,

    Je suis un peu perdu, je dois écrire un script pour insérer une ligne dans un fichier.
    Je dois impérativement le faire dans un script sh.
    J'ai sed dans mon environnement mais sed -i ne fonctionne pas : option illégal...

    Cette ligne contient des espaces et des caractères spéciaux : voici un exemple de ligne "toto::toto tata()" à la ligne 3

    J'ai essayé avec sed mais je ne parviens pas.

    J'ai essayé avec perl ca marche bien si la ligne n'a pas d'espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    ligne="toto::toto tata()"
    num_ligne=3
    fichier="test.txt"
    perl -i.bak -lpe'print "'${ligne}'" if $.=='${num_ligne}'' ${fichier}
    Avec cette exemple j'obtiens ce message :
    Can't find string terminator '"' anywhere before EOF at -e line 1.
    Du coup si quelqu'un peut m'aider ce serait génial.
    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour

    selon moi, en utilisant perl, même sed, tu sors du cadre qui t'a été imposé : « impérativement le faire dans un script sh »
    sinon autant tout faire dans un script perl, ou sed !

    si ta version de sed ne dispose pas de l'option -i, c'est que tu n'es pas dans un environnement GNU.
    quel est ton environnement de travail ?

    d'abord : apprendre à lire un fichier ligne par ligne en shell.

    en gros,
    tu lis le fichier une ligne à la fois
    tu vérifies le nombre de lignes lues
    tu affiches la ligne lue
    quand tu arrives à la ligne visée
    - tu affiches la ligne souhaitée
    et tu rediriges tout ça dans un fichier temporaire
    enfin tu écrases le fichier à modifier avec le fichier temporaire.
    finEnGros
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Pour ton problème avec perl, il faut que tu protèges $ligne du découpage en mots par le shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i.bak -lpe'print "'"$ligne"'" if $.=='$num_ligne $fichier

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2009
    Messages : 16
    Par défaut
    Super la ligne donné fonctionne parfaitement, j'avais essayé de protégé mais sans succès...

    Par contre maintenant j'ai un autre souci : la ligne à écrire commence par des espaces (c'est une indentation), et quand j'écris la ligne les espaces de début ne s'écrivent pas.

    Y a'til un moyen de faire en sorte (avec la ligne perl) de conserver les espaces de début de ligne?

  5. #5
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Je n'ai pas ce problème chez moi.
    Peux-tu donner les commandes précises par lesquelles :
    - tu affectes à la variable ligne la chaine de caractères commençant par des espaces ;
    - tu écris le contenu de cette variable dans le fichier $fichier.

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    sans perl ni sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    ligne="toto::toto caca()"
    num_ligne=3
    fichier="test.txt"
     
    while read machin; do
       ((compteur++))
       echo "$machin"
       if (($compteur == $num_ligne)); then
          echo "$ligne"
       fi
    done < "$fichier" > "${fichier}.bak" &&
    rm "$fichier" && mv "${fichier}.bak" "$fichier"
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat test.txt
    ligne 1
    ligne 2
    ligne 3
    toto::toto caca()
    ligne 4
    ligne 5
    ligne 6
    ligne 7

Discussions similaires

  1. [Débutant] écrire une matrice dans un fichier
    Par untelmatlab dans le forum MATLAB
    Réponses: 1
    Dernier message: 13/11/2009, 10h16
  2. [Images] Écrire une image dans un fichier temporaire
    Par naru40001 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 30/10/2008, 11h41
  3. écrire une variable dans un fichier
    Par Bathou dans le forum Débuter
    Réponses: 2
    Dernier message: 11/09/2008, 15h00
  4. Réponses: 4
    Dernier message: 21/03/2007, 11h35
  5. Comment écrire une section dans un fichier ini?
    Par Jayceblaster dans le forum Delphi
    Réponses: 5
    Dernier message: 26/06/2006, 14h08

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