Précédent   Forum du club des développeurs et IT Pro > Systèmes > Linux > Shell et commandes GNU
Shell et commandes GNU Vos questions sur l'utilisation des commandes shell. Manuel Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/07/2012, 21h48   #1
ldiaz
Membre actif
 
Luis
Inscription : avril 2006
Messages : 595
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 595
Points : 192
Points : 192
Par défaut Ajouter des caractères avec sed

Bonsoir a tous,

j'ai un fichier avec des registres et pour un des champs je dois ajouter en fin de ligne une suite de lettre...mais voila je sais pas trop comment.

Voici le fichier:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
=LDR  01649nas a22003851a 4500
=001  vtls000000236
=003  VRT
=005  20110511110800.0
=008  100528d19832011spca|||||\|||o0\\\||cat|\
=035  \\$aC2586-23760
=039  \9$a201105111108$bstaff$c201104181341$dstaff$c201104181329$dstaff$c201104181327$dstaff$y2000092208370000$zload
=040  \\$aES-Ba-GIE$bcat$cEs-Ba-GIE
=090  \\$a03
=091  \\$aDeixat de publicar
=092  \\$aAnuari
=098  \\$aGI-0350
=099  \\$aSALA-03.03(C)
=245  00$aHotels Catalunya :$bguia... /$cGeneralitat de Catalunya. Departament de  Comerç,Turisme i Consum. Direcció General de Turisme
=246  3\$aGuia d'hotels...
=260  \\$aBarcelona :$bGeneralitat de Catalunya. Departament de d'Indústria, Comerç i Turme,$c1983-2011
=310  \\$aAnual
=362  0\$a1983-2011
=500  \\$aFins l'any 2005 ho publicava el  Departament d'Indústria, Comerç i Turisme
=500  \\$aTÃ*tol a coberta: "Guia d'hotels..."
=530  \\$aTambé disponible la consulta interactiva a través de la pÃ*gina web del Departatenn
=650  04$aHotels
=651  \4$aCatalunya
=710  2\$aCatalunya.$bDepartament d'Indústria, Comerç i Turisme
=710  1\$aCatalunya.$bDirecció General de Turisme
=730  00$aPEC 2006-2009
=830  \0$aGuies (Catalunya. Generalitat) ;$v7
=952  \0$85$aAny inf.:$bEd.$u1$vc$wa
=952  \0$82.17$aAny inf.: 1999 Ed. 1998
=952  \0$82.18$aAny inf.: 2000 Ed. 2000
=935  \\$aC258623760
=999  \\$aVIRTUA50
=999  \\$aVTLSSORT0010*0030*0050*0080*0350*0390*0400*0900*0910*0920*0980*0990*2450*2460*2600*3100*3620*5000*5001*5300*6500*6510*7100*7101*7300*8300*8560*9350*9990*9991
 
=LDR  00964nam a22002531a 4500
=001  vtls000000113
=003  VRT
Le champs =LDR sert a separer les registres...Et les champs commencent tous par un ID avec un = devant

le champ qui m'interesse est de =952
Dans l'exemple il se repete plusieurs fois dans le même registre.. Ça c'est normal.
Donc je souhaite ajouter ceci $aidescat$bidescat a la fin de chaque champs =952
Ce qui donnerait (j'en orend 2 juste pour l'exemple):


Code :
1
2
=952  \0$85$aAny inf.:$bEd.$u1$vc$wa$aidescat$bidescat
=952  \0$82.17$aAny inf.: 1999 Ed. 1998$aidescat$bidescat
Alors en cherchant un peu j'ai trouvé ceci:

Code :
 sed -i '/[0-9]\{9\} 952/s/\($a.*\)/\1\$aidescat$bidescat /g' Result.txt >salida.mrk
Mais le fichier de sortie est vide.
Quelqu'un connait le truc?

D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2012, 22h41   #2
zipe31
Expert Confirmé Sénior
 
Inscription : janvier 2011
Messages : 1 452
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 1 452
Points : 4 444
Points : 4 444
Salut,

Code :
sed '/^=952 / s/$/$aidescat$bidescat /' Result.txt >salida.mrk
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/07/2012, 08h29   #3
ldiaz
Membre actif
 
Luis
Inscription : avril 2006
Messages : 595
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 595
Points : 192
Points : 192
Bonjour
wha genial ça marche.. J'aimerais comprendre.
Le caracter ^ signifie "position toi a la fin" et le fait de le placer devant le 952 ça revient a dire, positione toi a la fin du champs 952 ?
Ça marche comme ça?
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2012, 09h16   #4
zipe31
Expert Confirmé Sénior
 
Inscription : janvier 2011
Messages : 1 452
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 1 452
Points : 4 444
Points : 4 444
Citation:
Envoyé par ldiaz Voir le message
Le caracter ^ signifie "position toi a la fin" et le fait de le placer devant le 952 ça revient a dire, positione toi a la fin du champs 952 ?
Ça marche comme ça?
Euh... non, pas du tout

le caractère '^' placé en premier dans un motif comprenant une expression régulière signfie le début de la ligne. Donc dans ton cas, /^=952 / veut dire qu'on recherche une ligne commençant par le signe égale et suivi du nombre 952, lui même suivi d'un espace.

Le caractère "$" (dollar) quant à lui, placé en fin d'un motif de recherche, signifie la fin d'une ligne, ce qui se traduit dans l'expression s/$/$aidescat$bidescat /, substituer (commande s), la fin de la ligne représentée par le signe $ (dollar) par le motif "$aidescat$bidescat ".
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/07/2012, 09h30   #5
ldiaz
Membre actif
 
Luis
Inscription : avril 2006
Messages : 595
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 595
Points : 192
Points : 192
Bonjour
a ben j'ai bien fait de poser la question.
J'aurais certainement d'autres cas, comme par exemple isoler une partie et la remplacer par autre chose, et la...c'est pareil comment faire?

L'exemple est le suivant:

dans le nouveau fichier j'ai ceci:

Code :
=952  \0$82.3$aAny inf.: 1997 Ed. 1998$aidescat$bidescat
Et si je souhaite effacer le texte qui se trouve entre le premier \0$ et le $a
c'est a dire, ceci: \0$82.3

Code :
=952  $aAny inf.: 1997 Ed. 1998$aidescat$bidescat
Ça peut aussi se faire avec sed?

D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2012, 09h43   #6
zipe31
Expert Confirmé Sénior
 
Inscription : janvier 2011
Messages : 1 452
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 1 452
Points : 4 444
Points : 4 444
Re-

Pour l'exemple je n'affiche que les lignes de ton fichiers commençant par "=952".
Contenu de ton fichier :
Code :
1
2
3
4
5
$ sed -n '/^=952 /p' plop 
=952  \0$85$aAny inf.:$bEd.$u1$vc$wa
=952  \0$82.3$aAny inf.: 1997 Ed. 1998$aidescat$bidescat
=952  \0$82.17$aAny inf.: 1999 Ed. 1998
=952  \0$82.18$aAny inf.: 2000 Ed. 2000
Traitement sur le fichier :
Code :
1
2
3
4
5
$ sed -n '/^=952 /{s/\\0$[^$]*//p}' plop 
=952  $aAny inf.:$bEd.$u1$vc$wa
=952  $aAny inf.: 1997 Ed. 1998$aidescat$bidescat
=952  $aAny inf.: 1999 Ed. 1998
=952  $aAny inf.: 2000 Ed. 2000
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/07/2012, 09h58   #7
ldiaz
Membre actif
 
Luis
Inscription : avril 2006
Messages : 595
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 595
Points : 192
Points : 192
Oula ça se complique...
Alors ce que je comprends:

Pour l'affichage c'est ok, ça je vois bien comment ça marche:
Code :
sed -n '/^=952 /p' plop
p pour print surement

Mais l'autre commande:
Code :
sed -n '/^=952 /{s/\\0$[^$]*//p}' plop
ça dit, traite seulement toutes lignes qui commencent par =952
je suppose que {} c'est pour encapsuler une autre serie de commande.
le s/ pour substitute
\\0$ .. le premier slash c'est pour faire un escape n'est ce pas?
[^$] ça je pige pas.
et les // ça veut dire que tu remplace par rien.

Ça marche bien, je clic sur resolu.

Merci pour toutes les aides
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2012, 10h13   #8
zipe31
Expert Confirmé Sénior
 
Inscription : janvier 2011
Messages : 1 452
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 1 452
Points : 4 444
Points : 4 444
Citation:
Envoyé par ldiaz Voir le message
Oula ça se complique...
Alors ce que je comprends:

Pour l'affichage c'est ok, ça je vois bien comment ça marche:
Code :
sed -n '/^=952 /p' plop
p pour print surement
Oui. Mais là c'était uniquement dans le but de n'afficher que la partie qui nous intéressait à titre d'exemple.

Citation:
Mais l'autre commande:
Code :
sed -n '/^=952 /{s/\\0$[^$]*//p}' plop
ça dit, traite seulement toutes lignes qui commencent par =952
Oui.

Citation:
je suppose que {} c'est pour encapsuler une autre serie de commande.
OUi. Comme c'est placé derrière le motif, les commandes ne s'appliqueront qu'aux lignes contenant ce motif.

Citation:
le s/ pour substitute
Oui.

Citation:
\\0$ .. le premier slash c'est pour faire un escape n'est ce pas?
Oui, c'est pour protéger l'anti-slash existant. Le "\" est un caractère réservé pour sed (et bien d'autres programmes), donc pour une interprétation littérale il faut le protéger afin qu'il soit reconnu en tant que tel...

Citation:
[^$] ça je pige pas.
Il faut parler de l'expression entière "[^$]*" avec le "*" (astérisque) compris.
En fait le "^" placé entre crochets (les crochets permettent de regrouper des caractères), indique que le (ou les) caractère(s) qui le suive(nt), ne devront pas faire partie de la chaîne de caractères recherchée et par conséquent l'évaluation du motif s'arrêtera dès qu'un des caractères excluent sera rencontré.
Donc on cherche aucun, un ou plusieurs caractères (*) sauf un dollar ($)

Citation:
et les // ça veut dire que tu remplace par rien.
Oui. En gros on efface.

Citation:
Ça marche bien, je clic sur resolu.

Merci pour toutes les aides
De rien
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/07/2012, 10h17   #9
ldiaz
Membre actif
 
Luis
Inscription : avril 2006
Messages : 595
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 595
Points : 192
Points : 192
C'est de la folie sed... non?
J'adore.
Merci pour tes explication, c'est super clair.
Te te souhaite une bonne journée !
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h04.


 
 
 
 
Partenaires

Hébergement Web