[SHELL] insérer des quotes dans un fichiers

Fermé
Godz - 31 juil. 2006 à 11:10
 Godz - 3 août 2006 à 05:30
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 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 juil. 2006 à 12:28
Salut,

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

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

Godz
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
31 juil. 2006 à 19:32
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
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
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
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
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
1 août 2006 à 21:40
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
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 août 2006 à 08:15
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
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
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
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 août 2006 à 09:58
Affiches-nous une partie (une dizaine de lignes) de ton fichier "qmajb.log" s'il te plaît, enfin si possible ;-))
0
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 août 2006 à 10:21
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
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 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 août 2006 à 11:10
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 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 août 2006 à 14:47
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
ok merci les gars d'avoir pris le tps de repondre a mes questions.

Godz
0