Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/09/2007, 10h33   #1
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Par défaut Remplacement spécial de string dans un fichier

Bonjour,

J'aurais besoin de remplacer des chaînes dans un fichier.

Je souhaiterais préfixer pour les lignes commençant par DOC_AVAILABLE_LANGUAGE les valeurs situées après les deux points.
Un extrait du fichier (qui est bien plus gros en réalité) :

Citation:
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0920/TRA-20070920123446342
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: FR
DOC_TITLE: Le Consensus européen pour le développement
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: campoem
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 1
UPDATE_DATE: 20-Sep-2007 12:00:00 am
REQ_CODE: DEV
REQ_SERVICE: IE/CE/DEV/A/04
REQ_ORIGINE:
DOC_TYPE: TRA
DOC_FORMAT: DOC
DOC_LANG_AVAILABLE: FR AU
REQ_YEAR: 2007
DOC_NUMBER: 181
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 302080
<<EOD>>
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0911/ORI-20070911124118280
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: IW
DOC_TITLE: G/TBT/N/ISR/186 - text of project - Playground equipment
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: VERHELLEN Nadine +58749 B100 06/037 ENTR/C/03
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 0
UPDATE_DATE: 19-Sep-2007 12:00:00 am
REQ_CODE: ENTR
REQ_SERVICE: IE/CE/ENTR/C/03
REQ_ORIGINE:
DOC_TYPE: ORI
DOC_FORMAT: PDF
DOC_LANG_AVAILABLE: IW EN
REQ_YEAR: 2007
DOC_NUMBER: 1767
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 37130
<<EOD>>
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0830/ORI-20070830094004034
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: AR
DOC_TITLE: G/TBT/N/QAT/25 - HONEY PRODUCED BY HONEY BEES
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: lichdbe
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 0
UPDATE_DATE: 19-Sep-2007 12:00:00 am
REQ_CODE: ENTR
REQ_SERVICE: IE/CE/ENTR/C/03
REQ_ORIGINE:
DOC_TYPE: ORI
DOC_FORMAT: PDF
DOC_LANG_AVAILABLE: AR EN
REQ_YEAR: 2007
DOC_NUMBER: 1679
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 16500
<<EOD>>
Et le résultat à obternir :

Citation:
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0920/TRA-20070920123446342
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: FR
DOC_TITLE: Le Consensus européen pour le développement
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: campoem
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 1
UPDATE_DATE: 20-Sep-2007 12:00:00 am
REQ_CODE: DEV
REQ_SERVICE: IE/CE/DEV/A/04
REQ_ORIGINE:
DOC_TYPE: TRA
DOC_FORMAT: DOC
DOC_LANG_AVAILABLE: lang_FR lang_AU
REQ_YEAR: 2007
DOC_NUMBER: 181
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 302080
<<EOD>>
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0911/ORI-20070911124118280
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: IW
DOC_TITLE: G/TBT/N/ISR/186 - text of project - Playground equipment
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: VERHELLEN Nadine +58749 B100 06/037 ENTR/C/03
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 0
UPDATE_DATE: 19-Sep-2007 12:00:00 am
REQ_CODE: ENTR
REQ_SERVICE: IE/CE/ENTR/C/03
REQ_ORIGINE:
DOC_TYPE: ORI
DOC_FORMAT: PDF
DOC_LANG_AVAILABLE: lang_IW lang_EN
REQ_YEAR: 2007
DOC_NUMBER: 1767
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 37130
<<EOD>>
VdkVgwKey: /ec/prod/server/docserver/u002/home/docdgtp/documents/au/2007/0830/ORI-20070830094004034
COLL_NAME: DOCAU
DOC_LANGUAGE: AU
DOC_LANG_SOURCE: AR
DOC_TITLE: G/TBT/N/QAT/25 - HONEY PRODUCED BY HONEY BEES
DOC_STATUS:
DOC_KEY_WORDS:
DOC_AUTHOR: lichdbe
DOC_TRANSLATOR:
DOC_REVISOR:
TRANS_INT_EXT: 0
UPDATE_DATE: 19-Sep-2007 12:00:00 am
REQ_CODE: ENTR
REQ_SERVICE: IE/CE/ENTR/C/03
REQ_ORIGINE:
DOC_TYPE: ORI
DOC_FORMAT: PDF
DOC_LANG_AVAILABLE: lang_AR lang_EN
REQ_YEAR: 2007
DOC_NUMBER: 1679
DOC_VERSION: 0
DOC_PART: 0
DOC_SIZE: 16500
<<EOD>>
J'ai regardé du côté de la commande sed mais rien de concluant pour le moment, je pense que c'est possible en une ligne de commande ?

Des idées ?

Merci d'avance
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 13h10   #2
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
Salut,
Perl convient bien dans le traitement des fichiers :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Elive[/tmp]$ cat test.txt
DOC_FORMAT: DOC
DOC_LANG_AVAILABLE: FR AU
REQ_YEAR: 2007
DOC_NUMBER: 181
DOC_VERSION: 0
DOC_LANG_AVAILABLE: IW EN
REQ_YEAR: 2007
DOC_NUMBER: 1767
DOC_VERSION: 0
 
@Elive[/tmp]$ perl -pi -e "s/(DOC_LANG_AVAILABLE:) (.*) (.*)/\1 lang_\2 lang_\3/g" test.txt
 
@Elive[/tmp]$ cat test.txt
DOC_FORMAT: DOC
DOC_LANG_AVAILABLE: lang_FR lang_AU
REQ_YEAR: 2007
DOC_NUMBER: 181
DOC_VERSION: 0
DOC_LANG_AVAILABLE: lang_IW lang_EN
REQ_YEAR: 2007
DOC_NUMBER: 1767
DOC_VERSION: 0
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 14h29   #3
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Merci pour cette aide, on converge.

J'ai oublié d'indiquer que cette ligne :

Code :
DOC_LANG_AVAILABLE: FR AU
Peut contenir une liste de language qui différe d'une ligne à l'autre, par exemple dans le même fichier :

Code :
1
2
3
4
5
6
7
...
DOC_LANG_AVAILABLE: FR DE GA
...
DOC_LANG_AVAILABLE: FR
...
DOC_LANG_AVAILABLE: FR DE GA SV TR
...
Apparement la commande fonctionne pour un nombre fixe de 2 langues , sinon j'obtiens un résultat comme :

Code :
1
2
3
4
 
...
DOC_LANG_AVAILABLE: lang_FR DE lang_GA
...
C'est possible en une commande pour ce nombre variable de langues ?

Merci d'avance
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 15h11   #4
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
C'est parfaitement possible avec un "one-line" sed:
Code :
sed -r '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' ton-fichier
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 15h46   #5
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Citation:
Envoyé par ripat Voir le message
C'est parfaitement possible avec un "one-line" sed:
Code :
sed -r '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' ton-fichier
J'ai tenté cette commande, en remplaçant le -r (n'existe pas apparement) par -e , et ça me donne une erreur :
Code :
1
2
3
 
bash-2.05$ sed -e '/^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g' fichier.txt
sed: command garbled: /^DOC_LANG_AVAIL/ s/ (..)/ lang_\1/g
Une erreur dans la commande, mais j'arrive pas à voir où.
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 16h14   #6
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
C'est que l'option -r (regexp extended) n'est pas supportée par ta version de sed. Je l'utilise uniquement pour rendre la regex plus lisible. Essaye

Code :
sed  '/^DOC_LANG_AVAIL/ s/ \(..\)/ lang_\1/g' fichier
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 16h27   #7
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Citation:
Envoyé par ripat Voir le message
C'est que l'option -r (regexp extended) n'est pas supportée par ta version de sed. Je l'utilise uniquement pour rendre la regex plus lisible. Essaye

Code :
sed  '/^DOC_LANG_AVAIL/ s/ \(..\)/ lang_\1/g' fichier
ça me semble tout bon maintenant.

Un grand merci pour la rapidité et la qualité de votre aide.

Bonne fin de journée.
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h58.


 
 
 
 
Partenaires

Hébergement Web