[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.
A voir également:

19 réponses

lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

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

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

Godz
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
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
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
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Affiches-nous une partie (une dizaine de lignes) de ton fichier "qmajb.log" s'il te plaît, enfin si possible ;-))
0
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
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
Godz
 
ok merci les gars d'avoir pris le tps de repondre a mes questions.

Godz
0