Script pour écrire dans un fichier texte

Résolu
flipmode62 Messages postés 52 Statut Membre -  
flipmode62 Messages postés 52 Statut Membre -
Bonjour,

Je travaille sous Linux. Je suis débutant en script.

J'aimerai créer un script pour modfifier un fichier texte en changeant une valeur par une valeur provenant d'un autre fichier texte. Est ce que c'est possible de faire ça?

Pour le moment, je récupére le résultat de ma requete SQL dans le fichier requete.lst, j'aimerai utiliser ce résultat pour le mettre dans fichier.txt mais je dois mettre ce résultat à un endroit précis dans fichier.txt

fichier.txt est de la forme :
..........................................
..........................................
define text {
text=xxxxx
test1="ceci est un test"
test2="ceci est un test"
test3="ceci est un test"
}
........................................
........................................

var=$(cat requete.lst)
echo $var > fichier.txt


J'aimerai remplacer uniquement les xxxxx par le résultat de ma requete

Merci pour votre aide

Flipmode
Configuration: Linux Red Hat
Firefox 1.5.0.12

21 réponses

  • 1
  • 2
  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-
    [tmpfs]$ var1=YYYYY
    
    [tmpfs]$ var2=XXXXX
    
    [tmpfs]$ cat fichier
    define host {
    host_name=localhost
    x=180
    y=180
    recognize_services=1
    label_show=1
    text=AAAA
    }
    
    define host {
    host_name=localhost1
    x=280
    y=580
    recognize_services=1
    label_show=1
    text=BBBB
    }
    
    [tmpfs]$ sed "/localhost/,/}/{
    /^text/{s/=.*/=$(echo $var1)/}
    }
    /localhost1/,/}/{
    /^text/{s/=.*/=$(echo $var2)/}
    }
    " fichier
    
    define host {
    host_name=localhost
    x=180
    y=180
    recognize_services=1
    label_show=1
    text=YYYYY
    }
    
    define host {
    host_name=localhost1
    x=280
    y=580
    recognize_services=1
    label_show=1
    text=XXXXX
    }
    
    [tmpfs]$
    ;-))

    PS. lami20j => Son truc est un peu tordu, il y a quelques paramètres à prendre en compte (saut de ligne dans la variable, les valeurs suivants "text=" ne sont pas connues à l'avance, etc.) ;-(
    2
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Je suis d'accord.
      Toutefois host_name est toujours localhost et localhost1 ou c'est aussi variable?!
      Puisque si ce n'est pas le cas il faut revoir la commande.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        Puisque si ce n'est pas le cas il faut revoir la commande.
        Tu as raison, mais j'ai fait avec ce qu'on m'a donné ;-((

        Merci toutefois pour ta bienveillance ;-))
        0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    jp@MDK:~ ssh$ var="AAAAA"
    
    jp@MDK:~ ssh$ echo $var
    AAAAA
    
    jp@MDK:~ ssh$ cat fichier.txt
    ..........................................
    ..........................................
    define text {
    text=xxxxx
    test1="ceci est un test"
    test2="ceci est un test"
    test3="ceci est un test"
    }
    
    jp@MDK:~ ssh$ sed "/^text/{s/=.*/=$var/}" fichier.txt
    ..........................................
    ..........................................
    define text {
    text=AAAAA
    test1="ceci est un test"
    test2="ceci est un test"
    test3="ceci est un test"
    }
    
    jp@MDK:~ ssh$ 
    Pour que le résultat soit permanent il suffit d'ajouter l'option "-i" (-i.bak pour faire une sauvegarde du fichier original) :
    jp@MDK:~ ssh$ sed -i.bak "/^text/{s/=.*/=$var/}" fichier.txt
    
    jp@MDK:~ ssh$ cat fichier.txt
    ..........................................
    ..........................................
    define text {
    text=AAAAA
    test1="ceci est un test"
    test2="ceci est un test"
    test3="ceci est un test"
    }
    jp@MDK:~ ssh$
    ;-))
    1
  3. flipmode62 Messages postés 52 Statut Membre
     
    Merci pour la rapidité de ta réponse

    J'ai un probléme lorsques je fais:
    sed "/^text/{s/=.*/=$var/}" fichier.txt
    sed: -e expression #1, char 54: unterminated `s' command

    Merci pour ton aide

    Flipmode
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Elle contient quoi ta variable $var ??? Des slashs ?
      0
  4. flipmode62 Messages postés 52 Statut Membre
     
    Ma variable var contient :
    32 Test. 45 Test structur??

    Pouvez vous m'expliquer les différentes options de la commande :
    sed "/^text/{s/=.*/=$var/}" fichier.txt

    La commande: sed "/^text/{s/=.*/=$var/}" fichier.txt , vous l'utilisez dans un script ou vous l'a tappez directement dans un terminal?

    Merci

    Flipmode
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Bizarre ;-\
      jp@MDK:~ ssh$ cat fichier.txt
      ..........................................
      ..........................................
      define text {
      text=AAAAA
      test1="ceci est un test"
      test2="ceci est un test"
      test3="ceci est un test"
      }
      
      jp@MDK:~ ssh$ echo $var
      32 Test. 45 Test structur??
      
      jp@MDK:~ ssh$ sed "/^text/{s/=.*/=$var/}" fichier.txt
      ..........................................
      ..........................................
      define text {
      text=32 Test. 45 Test structur??
      test1="ceci est un test"
      test2="ceci est un test"
      test3="ceci est un test"
      }
      
      jp@MDK:~ ssh$
      ;-)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. flipmode62 Messages postés 52 Statut Membre
     
    J'ai toujours la meme erreur: sed: -e expression #1, char 53: unterminated `s' command
    Pourtant sed est intallé, j'ai fait un yum install sed

    Pouvez vous m'expliquer les différentes options de la commande :
    sed "/^text/{s/=.*/=$var/}" fichier.txt

    Est ce que vous utilisez la commande sed "/^text/{s/=.*/=$var/}" fichier.txt dans un script ou est ce que vous l'a tappez directement dans un terminal?

    Merci
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    /^text/{
    On recherche une ligne commençant (^) par "text", et quand on la trouve on applique alors les instructions contenues entre les accolades

    s/=.*/=$var/
    On substitue le signe égal et tout ce qui se trouve après, par le signe égal suivi du contenu de la variable "$var"

    Pour mon test j'ai lancé la commande depuis un terminal en déclarant ma variable auparavant. Mais il ne devrait pas y avoir de soucis depuis un script, à partir du moment où la variable elle même est déclarée dans ce même script...
    0
  8. flipmode62 Messages postés 52 Statut Membre
     
    J'ai effectivement un probléme!! Si j'affecte test à la variable var (var=test) et que je fais: sed "/^text/{s/=.*/=$var/}" fichier.txt

    J'obtiens:
    ..........................................
    define text {
    text=test
    test1="ceci est un test"
    test2="ceci est un test"
    test3="ceci est un test"
    }

    Donc ça marche!!

    En revanche, si je fais: var=32 Test. 45 Test structur , alors ça ne marche pas!!
    Quand je fais: sed "/^text/{s/=.*/=$var/}" fichier.txt
    J'obtiens sed: -e expression #1, char 53: unterminated `s' command

    Il n'aime pas les espaces!! Et a chaque fois, il y a des espaces dans le résultats de ma requete SQL donc voila pourquoi ça ne marche pas :(

    Je ne sais pas comment résoudre ce probléme :(
    0
  9. flipmode62 Messages postés 52 Statut Membre
     
    si je fais: var="32 Test. 45 Test structur" ça marche!!

    Il faut juste que je rajoute des " au début et à la fin du résultat de ma requete SQL qui se trouve dans mon fichier requete.lst

    Comment je peux faire ça?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      var="\"$(cat requete.lst)\"" 
      0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Alors essaie comme ça en copier/collant la syntaxe suivante à la place de l'autre avec une variable => var=""32 Test. 45 Test structur??" :
    sed '/^text/{s/=.*/='"$var"'/}'
    La nuance est infime, c'est au niveau des quotes simples et doubles.
    0
  11. flipmode62 Messages postés 52 Statut Membre
     
    Merci pour ton aide mais le sed '/^text/{s/=.*/='"$var"'/}' ne fonctionne pas :(
    0
  12. flipmode62 Messages postés 52 Statut Membre
     
    C'est bizarre!

    vi requete.lst
    6990 Doc non struct
    4905 Doc structur


    var="\"$(cat requete.lst)"\"

    echo $var
    "6990 Doc non struct 4905 Doc structur"</gras>

    sed "/^text/{s/=.*/=$var/}" fichier.txt
    sed: -e expression #1, char 35: unterminated `s' command

    Ca ne marche pas :(

    Alors que si je fais comme ci dessous ça marche :(
    var="6990 Doc non struct 4905 Doc structur"

    sed "/^text/{s/=.*/=$var/}" fichier.txt
    ..........................................
    ..........................................
    define text {
    text=6990 Doc non struct 4905 Doc structur
    test1="ceci est un test"
    test2="ceci est un test"
    test3="ceci est un test"
    }

    Je ne comprends pas pourquoi

    Merci d'avance pour votre aide$

    Flipmode
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      C'est le saut de ligne qui fiche le bronx et l'interprétation de la variable avec des quotes doubles autour ;-(
      [tmpfs]$ echo $var
      "Bonjour salut"
      
      [tmpfs]$ echo "$var"
      "Bonjour
      salut"
      
      [tmpfs]$
      Donc essaie comme ça :
      sed "/^text/{s/=.*/=$(echo $var)/}"
      ;-))
      0
  13. flipmode62 Messages postés 52 Statut Membre
     
    En bidouillant un peu ça marche, maintenant j'aimerai à partir des commandes précédentes réaliser un script pour qu'il s'éxécute toutes les 10 minutes.

    Mon script a la forme suivante:

    #!/bin/bash
    var="\"$(cat requete.lst)"\"
    echo $var>requete.lst
    var=$(cat requete.lst)
    sed -i.bak "/^text=/{s/=.*/=$var/}" fichier.txt


    Qu'en pensez vous?

    Merci

    Flipmode
    0
  14. flipmode62 Messages postés 52 Statut Membre
     
    Ca marche :)

    Problème résolu :)

    Merci beaucoup pour ton aide
    0
  15. flipmode62 Messages postés 52 Statut Membre
     
    Rebonjour,

    J'ai une dernière question. J'ai un fichier texte, qui est de la forme:

    define host {
    host_name=localhost
    x=180
    y=180
    recognize_services=1
    label_show=1
    text=AAAA
    }

    define host {
    host_name=localhost1
    x=280
    y=580
    recognize_services=1
    label_show=1
    text=BBBB
    }

    J'aimerai remplacer AAAA par $var1 et BBBB par $var2
    Si j'utilise la commande: sed "/^text/{s/=.*/=$(echo $var1)/}"
    Il change AAAA et BBBB par $var1

    J'ai essayé de faire:
    sed -i.bak "/^localhost/{s/text.*/text $(echo $var1)/}" /usr/local/nagios/share/nagvis/nagvis/etc/maps/demo.cfg
    sed -i.bak "/^localhost1/{s/text.*/text $(echo $var2)/}" /usr/local/nagios/share/nagvis/nagvis/etc/maps/demo.cfg


    Mais ça ne marche pas :(

    Merci pour votre aide

    Flipmode
    0
  16. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Utilise les guillemets
    lami20j@debian:~/trash$ cat flipmode
    define host {
    host_name=localhost
    x=180
    y=180
    recognize_services=1
    label_show=1
    text=AAAA
    }
    
    define host {
    host_name=localhost1
    x=280
    y=580
    recognize_services=1
    label_show=1
    text=BBBB
    }
    
    lami20j@debian:~/trash$ var1=flip;var2=mode
    lami20j@debian:~/trash$ sed -e "s/AAAA/$var1/" -e "s/BBBB/$var2/" flipmode
    define host {
    host_name=localhost
    x=180
    y=180
    recognize_services=1
    label_show=1
    text=flip
    }
    
    define host {
    host_name=localhost1
    x=280
    y=580
    recognize_services=1
    label_show=1
    text=mode
    }
    0
  17. flipmode62 Messages postés 52 Statut Membre
     
    Merci pour ta réponse

    Le probème c'est que je ne sais ce qu'il y a après text=
    Dans mon exemple, j'ai dit que c'était AAAA et BBBB mais ce n'est pas le cas. AAAA et BBBB vont varier, ce sont des résultats de requetes SQL. Donc je ne peux pas substituer AAAA et BBBB et les remplacer par $var1 et $var2

    Ta commande: sed -e "s/AAAA/$var1/" -e "s/BBBB/$var2/" flipmode ne marche pas pour moi :(

    Merci pour votre aide

    Flipmode
    0
  18. flipmode62 Messages postés 52 Statut Membre
     
    Merci à tous pour vos réponses et pour votre rapidité

    Les host_name sont toujours localhost et localhost1 donc la commande de jipicy fonctionne:
    sed "/localhost/,/}/{
    /^text/{s/=.*/=$(echo $var1)/}
    }
    /localhost1/,/}/{
    /^text/{s/=.*/=$(echo $var2)/}
    }
    " fichier


    Je n'ai pas trop compris l'utilisation des } { mais ça marche :) :)

    Encore merci à tous les deux

    Flipmode
    0
  19. flipmode62 Messages postés 52 Statut Membre
     
    J'ai vu qu'on pouvait récupérer la 1ere ligne d'un fichier texte en utilisant la commande :
    sed -n '1p' /fichier.txt >test.txt

    J'aimerai savoir si c'est possible de récupérer uniquement le 1er mot de la 1ere ligne ?
    Si oui, en utilisant quelle commande?

    Merci d'avance pour votre aide

    Flipmode
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Re-

      Ce sera plus simple avec awk je pense :
      awk 'NR == 1 { print $1 }' fichier
      ;-))
      0
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Je te mets quand même la version avec sed :
      sed -n '1 s/\([^ ]*\).*/\1/p' fichier
      au cas ou...
      0
  20. flipmode62 Messages postés 52 Statut Membre
     
    Merci pour ton aide! Ca fonctionne super bien avec awk

    :)
    0
  21. flipmode62 Messages postés 52 Statut Membre
     
    J'essaye de faire un script shell en utilisant des conditions mais ça ne marche pas :(

    if [$var1>1200] then
    echo "test"
    #var1=<b><font color=#0c00ff>$var1</font></b>
    else
    echo "test2"
    #var1=<b><font color=#ce0000>$var1</font></b>
    fi


    line 35: syntax error near unexpected token `else'
    line 35: `else'


    Merci pour votre aide

    Flipmode
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Merci d'ouvrir un nouveau fil s'il te plait...
      0
  • 1
  • 2