[SHELL] insérer des quotes dans un fichiers

Godz -  
 Godz -
bonjour a tous

voila je voudrais modifier par exemple cette ligne :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
en cette ligne :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'

j'ai deja essaye pas mal de solutions sans succes (isole chaque champ et les passer en variables dans ma requete db2 par exemple).
je m'en remet donc a vos lumieres pour au moins avoir une piste pour avancer parce que la j'ai du mal.

merci.

19 réponses

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

    As-tu essayé d'echapper les apostrohpes avec un antislash \' ?

    lami20j
    0
  2. Godz
     
    en effet j'ai deja essaye cette option sans succes

    Godz
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    J'ai fait au plus simple, c'est à dire de quoter ce qui est entre le signe "égale" :
    [jp@MDK ~]$ var=":update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979"
    
    [jp@MDK ~]$ echo $var | sed "s/\(.*= \)\(.*\)\( =.*\)/\1\'\2\'\3/"
    
    :update nsc_tval set qmajb = 'QBASE-03 where cval' = DE000CG08979
    
    [jp@MDK ~]$
    A adapter ;-))
    0
  4. Godz
     
    salut,

    pas mal du tt, ca m'aide bien ta solution jipicy j'ai notement pu isoler le dernier champ avec cette commande:
    echo $var | sed "s/\(.*= \)\(.*\)\($\)/\1\'\2\3\'/"
    update nsc_tval set qmajb = QBASE-03 where cval = 'DE000CG08979'
    mais j'ai toujours un petit souci pour isoler le champ intermediaire QBASE-03, en effet je ne vois pas comment utiliser l'espace comme delimiteur, est ce possible dans la commande sed ?
    j'ai teste plusieurs possiblites sans succes, ca commence vraiment a me ****. lol

    merci
    Godz
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Godz
     
    cette solution me donne presque ce que je veux mais il semble que le caractere "-" foute la merde:
    echo $var | sed "s/\(QBASE*\)/'\1'/"
    update nsc_tval set qmajb = 'QBASE'-03 where cval = DE000CG08979

    j'y suis presque ca me saoul.lol

    Godz
    0
  7. Godz
     
    ok autant pour moi c bon j'ai trouve
    pour info : echo $var | sed "s/\(QBASE-0[1-3]\)/'\1'/"
    update nsc_tval set qmajb = 'QBASE-03' where cval = DE000CG08979
    en ts cas j'aurais bien galere

    merci pour tte les infos qui m'ont permis d'avancer.

    Godz
    0
  8. Godz
     
    bon alors bon

    encore un petit souci, cette fois ci, lorsque je passe ma cmd dans le terminal ca passe nikel:
    line=update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    echo $line | sed "s/\(QBASE-0[1-3]\)/'\1'/" | sed "s/\(.*= \)\(.*\)\($\)/\1\'\2\3\'/"
    update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    par contre quand je lance cette commande dans un script, ca me donne ce resultat:
    line=update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    'pdate nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979
    dc la je suis un peu perdu, please help me.

    merci d'avance
    Godz
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Désolé, mais je rentre juste là ...

    Faudrait que tu nous colles ton script pour qu'on puisse voir où ça coince, parce que là à vue de nez, ben c'est pas simple ;-))

    Sinon, j'avais fait cette regex pour isoler tes 2 champs quel que soit le contenu des 2 champs proprement dit, mais à condition que la forme de la ligne soit rigoureusement identique :
     var=":update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979"
    
     echo $var | sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/"
    
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    ;-))
    0
  10. Godz
     
    merci pour ton aide jipicy vraiment ca m'aide beaucoup.
    En fait mon script c'est juste d'integrer le tout dans une boucle,
    parce que mes requetes db2 sont toutes stockées dans un fichier et je voudrais les executes une par une en inserant les quotes requis.
    j'ai essaye ca avec le pb cite precedement:
    while read < qmajb.log
    do
    echo $REPLY
    echo $REPLY | sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/"
    done

    Godz
    0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut Godz,

    Ben en fait, faut pas t'embêter avec une boucle dans ce cas là, le filtre "sed" a tout ce qu'il faut pour faire ça (man sed pour plus de détails).

    Au lieu de "parser" la ligne, suffit de "parser" le fichier dans sa totalité :
    [jp@MDK tmpfs]$ cat fich.txt
    
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    
    [jp@MDK tmpfs]$ sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/" fich.txt
    
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    
    [jp@MDK tmpfs]$ sed -i.orig "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/" fich.txt
    
    [jp@MDK tmpfs]$ ls -l
    
    total 8
    -rw-r--r--  1 jp jp 748 aoû  2 08:06 fich.txt
    -rw-r--r--  1 jp jp 704 aoû  2 08:05 fich.txt.orig
    
    [jp@MDK tmpfs]$ cat fich.txt*
    
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    :update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    :update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    
    [jp@MDK tmpfs]$ 
    L'option "-i.orig" sert en fait à écrire directement dans le fichier (fich.txt ici) et de faire une sauvegarde du fichier original dans un fichier nommé comme l'original mais "flanqué" de l'extension ".orig".

    ;-))
    0
  12. Godz
     
    salut jipicy,

    en fait je me suis rendu compte que c justement lorsque je passe ma commande sed sur le fichier complet que j'ai ce decalage de quote.
    en effet lorsque je teste le tout sur une seule ligne sa passe alors que sur le fichier --> pb (script ou pas script)
    alors je vois pas trop d'ou ca peut venir peut etre une histoire d'espace en plus ou en moins.
    je vais regarder ca de plus pres.

    en tous cas encore merci pour tes infos, n'etant pas un pro de linux je t'avoue que je galere un peu ts seul.

    Godz
    0
  13. Godz
     
    je crois savoir d'ou ca vient, qd je passe ma commande sed sur mon fichier, je recupere ceci:
    'pdate nsc_tval set qmajb = ' QBASE-03 ' where cval = ' DE000CG08979
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016921
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016988
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016996
    comme tu peux le voir, j'ai des espaces en plus entre les quotes d'ou ce decalage a la fin de chaque ligne puisqu'il n'y a pas d'espace a la fin de celle ci.

    Godz
    0
  14. Godz
     
    je ne comprends decidement pas pourquoi ca ca marche :

    [opnvwep@pluton1 MCO]$ var="update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979"
    [opnvwep@pluton1 MCO]$ echo $var | sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/"
    update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'

    et pourquoi ca ca marche pas :

    [opnvwep@pluton1 MCO]$ sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/" qmajb.log
    'pdate nsc_tval set qmajb = ' QBASE-03 ' where cval = ' DE000CG08979
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016921
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016988
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000016996
    'pdate nsc_tval set qmajb = ' QBASE-01 ' where cval = ' NL0000017002
    0
  15. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Affiches-nous une partie (une dizaine de lignes) de ton fichier "qmajb.log" s'il te plaît, enfin si possible ;-))
    0
  16. Godz
     
    update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016921
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016988
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016996
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017002
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017010
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017077
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017085
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017093
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017101
    0
  17. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Merci.

    Ben je comprend pas, chez moi ça marche bien :
    [jp@MDK tmpfs]$ cat godz.txt
    
    update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016921
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016988
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016996
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017002
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017010
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017077
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017085
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017093
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017101
    
    [jp@MDK tmpfs]$ sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/" godz.txt
    
    update nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016921'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016988'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016996'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017002'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017010'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017077'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017085'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017093'
    update nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017101'
    
    [jp@MDK tmpfs]$
    !!??
    0
  18. Godz
     
    alors la je crois que ca va rester un grand mystere, j'ai cree un nouveau fichier avec la meme chose dedans et en effet ca marche.
    donc je sais pas ce qu'il s'est passe avec mon fichier mais je me faisais chier avec alors qu'il etait foireux.

    en tous cas merci pour ton aide precieuse.

    Godz
    0
  19. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Y'a peut être une histoire de caractère de fin de ligne...
    Ton fichier est-il créé depuis un système Unix ou Windows ?

    Cherche pô j'ai trouvé, c'est bien ça, l'histoire des caractères de fin de ligne !!!

    Je viens de faire le test en rajoutant le caractère de fin de ligne propre à Window$ et j'ai la même erreur :
    [jp@MDK tmpfs]$ cat -t godz.txt
    
    update nsc_tval set qmajb = QBASE-03 where cval = DE000CG08979^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016921^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016988^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000016996^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017002^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017010^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017077^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017085^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017093^M
    update nsc_tval set qmajb = QBASE-01 where cval = NL0000017101^M
    
    [jp@MDK tmpfs]$ sed "s/\(.*= \)\(.*\)\( .* .* = \)\(.*\)/\1\'\2\'\3\'\4\'/" godz.txt
    
    'pdate nsc_tval set qmajb = 'QBASE-03' where cval = 'DE000CG08979
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016921
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016988
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000016996
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017002
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017010
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017077
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017085
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017093
    'pdate nsc_tval set qmajb = 'QBASE-01' where cval = 'NL0000017101
    
    [jp@MDK tmpfs]$


    Donc avant il te faut supprimer ce caractère de ton fichier avec la commande suivante :
    sed -i.BAK 's/^M/$/' godz.txt
    Le "^M" s'obtient en tapant "CTRL V" puis "CTRL M".

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

      le caractère de fin de ligne propre à Window

      Il s'agit en fait de CarriageReturn suit de NewLine \r\n
      Pour Unix c'est NewLine \n

      en bref il faut supprimer seulement \r
      sed -i.BAK 's/\r//' godz.txt

      sinon
      sed -i.BAK 's/\r\n/\n/' godz.txt
      lami20j
      0
  20. Godz
     
    ok merci les gars d'avoir pris le tps de repondre a mes questions.

    Godz
    0