Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment remplacer ou renommer plusieurs mots d'un champ sous UNIX

9 réponses
Avatar
Guytou
Bonjour à Tous,

J'ai un fichier nommé "rapport_rec.txt". J'aimerai avoir un script ou une
ligne de commande qui me permet
de renommer automatiquement le champ STATUT (champ numéro 5):

Nom du Job Debut du traitement Fin de traitement STATUT
_________ ___________________ __________________ ________
Lance_traite 05/04/2007 17:00 05/04/2007 17:52 SUCCESS
Comite_marcha 05/04/2007 17:00 05/04/2007 17:13 INACTIVE
Relance_client 05/04/2007 17:13 05/04/2007 17:24 FAILURE
Vehicule_groupe 05/04/2007 17:24 05/04/2007 17:52 FAILURE
Rapport_journalier 05/04/2007 17:00 05/04/2007 17:52 SUCCESS
Mise_a_jour_client 05/04/2007 17:00 05/04/2007 17:13 TERMINATED
Mise_a_jour_stock 05/04/2007 17:13 05/04/2007 17:24 FAILURE
Relantion_banques 05/04/2007 17:24 05/04/2007 17:52 FAILURE

J'aimerai avoir un script ou une ligne de commande pour renommer en une
seule fois:

SUCCESS en OK
INACTIVE en IN
FAILURE en KO
TERMINATED en TE

Je sais que l'on peut le faire avec sed pour remplacer ou renommer un seul
mot par exemple SUCCESS en OK.

sed "s/SUCCESS/OK/g" rapport_REC.txt

Comment faire pour remplacer ou renommer en une seule fois SUCCESS,
INACTIVE, FAILURE et TERMINATED?

Merci de votre aide.

GUYTOU

9 réponses

Avatar
Kevin Denis
Le 10-05-2007, Guytou a écrit :
J'aimerai avoir un script ou une ligne de commande pour renommer en une
seule fois:

SUCCESS en OK
INACTIVE en IN
FAILURE en KO
TERMINATED en TE

Je sais que l'on peut le faire avec sed pour remplacer ou renommer un seul
mot par exemple SUCCESS en OK.

sed "s/SUCCESS/OK/g" rapport_REC.txt

Comment faire pour remplacer ou renommer en une seule fois SUCCESS,
INACTIVE, FAILURE et TERMINATED?

$ cat sedfile

s/SUCCESS/OK/g
s/INACTIVE/IN/g
s/FAILURE/KO/g
s/TERMINATED/TE/g
$ cat fichier | sed -f sedfile > fichier_corrige

En gros, voila l'idee.
--
Kevin

Avatar
Pascal Bourguignon
Kevin Denis writes:

Le 10-05-2007, Guytou a écrit :
J'aimerai avoir un script ou une ligne de commande pour renommer en une
seule fois:

SUCCESS en OK
INACTIVE en IN
FAILURE en KO
TERMINATED en TE

Je sais que l'on peut le faire avec sed pour remplacer ou renommer un seul
mot par exemple SUCCESS en OK.

sed "s/SUCCESS/OK/g" rapport_REC.txt

Comment faire pour remplacer ou renommer en une seule fois SUCCESS,
INACTIVE, FAILURE et TERMINATED?

$ cat sedfile

s/SUCCESS/OK/g
s/INACTIVE/IN/g
s/FAILURE/KO/g
s/TERMINATED/TE/g
$ cat fichier | sed -f sedfile > fichier_corrige

En gros, voila l'idee.


On peut aussi donner plusieurs lignes sed en argument:

sed -e s/SUCCESS/OK/g -e s/INACTIVE/IN/g
-e s/FAILURE/KO/g -e s/TERMINATED/TE/g < fichier > fichier-corrige

C'est valable si on veut passer des commandes sed qui tiennent sur
plusieurs lignes (comme les boucles):

sed -e '{' -e ':loop' -e 's/abc/def/' -e 't :loop' -e '}'

--
__Pascal Bourguignon__ http://www.informatimago.com/

This is a signature virus. Add me to your signature and help me to live.


Avatar
Cyrille Lefevre
J'aimerai avoir un script ou une ligne de commande pour renommer en une
seule fois:

SUCCESS en OK
INACTIVE en IN
FAILURE en KO
TERMINATED en TE

Je sais que l'on peut le faire avec sed pour remplacer ou renommer un seul
mot par exemple SUCCESS en OK.

sed "s/SUCCESS/OK/g" rapport_REC.txt

Comment faire pour remplacer ou renommer en une seule fois SUCCESS,
INACTIVE, FAILURE et TERMINATED?

$ cat sedfile

s/SUCCESS/OK/g
s/INACTIVE/IN/g
s/FAILURE/KO/g
s/TERMINATED/TE/g
$ cat fichier | sed -f sedfile > fichier_corrige

En gros, voila l'idee.


la même en perl :

perl -pi.bak -e
's/SUCCESS/OK/g;s/INACTIVE/IN/g;s/FAILURE/KO/g;s/TERMINATED/TE/g'
fichier

l'interret de -pi est d'eviter de passer par un fichier temporaire
avec sauvegarde du fichier d'origine en .bak. pour ne pas faire de
sauvegarde, remplacer -pi.bak par -pi tout court.

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.


Avatar
Benoit Izac
Bonjour,

le 11/05/2007 à 00:33, Cyrille Lefevre a écrit dans le message
:

J'aimerai avoir un script ou une ligne de commande pour renommer en
une seule fois:

SUCCESS en OK
INACTIVE en IN
FAILURE en KO
TERMINATED en TE

$ cat sedfile

s/SUCCESS/OK/g
s/INACTIVE/IN/g
s/FAILURE/KO/g
s/TERMINATED/TE/g
$ cat fichier | sed -f sedfile > fichier_corrige


la même en perl :

perl -pi.bak -e
's/SUCCESS/OK/g;s/INACTIVE/IN/g;s/FAILURE/KO/g;s/TERMINATED/TE/g'
fichier

l'interret de -pi est d'eviter de passer par un fichier temporaire
avec sauvegarde du fichier d'origine en .bak. pour ne pas faire de
sauvegarde, remplacer -pi.bak par -pi tout court.


Ce qui est aussi intéressant aussi avec Perl, c'est d'utiliser un hash
pour stocker les remplacements :
- c'est plus lisible et maintenable lorsque le nombre de
remplacements est élevé ;
- ça évite d'avoir à recopier 50 fois la même expression
rationnelle surtout si elle est compliquée.


#!/usr/bin/perl
use warnings;
use strict;

my %abbr = ( SUCCESS => 'OK',
INACTIVE => 'IN',
FAILURE => 'KO',
TERMINATED => 'TE',
);

while (<>) {
chomp;
foreach my $word (keys %abbr) {
s/$words*$/$abbr{$word}/;
}
print "$_n";
}

__END__

--
Benoit Izac



Avatar
bull.titan
bonjour,

l'idée de kevin était bonne,

si tu veux un "programme" qui te fasse ca en ligne de commande, tu
peux essayer un truc du type :


#!/bin/bash

fichier=/chemin_vers_ton_fichier/rapport_rec.txt

cat ${fichier} |
sed -e s/SUCCESS/OK/g |
sed -e s/INACTIVE/IN/g |
sed -e s/FAILURE/KO/g |
sed -e s/TERMINATED/TE/g >${fichier}

et tu as juste a lancer le script pour que ca te fasse ta transfo
automatiquement
si le fichier est petit, ca ira, par contre si le fichier est gros, le
traitement risque de prendre bc plus de temps que les beaux scripts en
perl ^^

cdt,
Avatar
bull.titan
tu dois pouvoir le faire en awk aussi pour gagner du temps
Avatar
Benoit Izac
Bonjour,

le 13/05/2007 à 08:34, bull titan a écrit dans le message
:

l'idée de kevin était bonne,


Personne n'a dit le contraire.

si tu veux un "programme" qui te fasse ca en ligne de commande, tu
peux essayer un truc du type :


#!/bin/bash


Ça commence mal :
$ /bin/bash
sh: /bin/bash: No such file or directory

fichier=/chemin_vers_ton_fichier/rapport_rec.txt

cat ${fichier} |
sed -e s/SUCCESS/OK/g |
sed -e s/INACTIVE/IN/g |
sed -e s/FAILURE/KO/g |
sed -e s/TERMINATED/TE/g >${fichier}


Ne JAMAIS faire ça !

Le « cat » est inutile, tu appelles quatre processus « sed » alors qu'un
seul suffirait et le plus grave, c'est que $fichier va se retrouver
raccourci si sa taille est plus grande que le buffer utilisé.

et tu as juste a lancer le script pour que ca te fasse ta transfo
automatiquement
si le fichier est petit, ca ira, par contre si le fichier est gros, le
traitement risque de prendre bc plus de temps que les beaux scripts en
perl ^^


Je pense que tu voulais écrire l'inverse. Il est clair que les
performances en Perl sont bien moins bonne que celle de sed mais
personne ici n'a parlé de performance ou de fichier de grande taille.

--
Benoit Izac

Avatar
bull.titan
On 13 mai, 10:13, Benoit Izac wrote:
Bonjour,

le 13/05/2007 à 08:34, bull titan a écrit dans le message
:

l'idée de kevin était bonne,


Personne n'a dit le contraire.

si tu veux un "programme" qui te fasse ca en ligne de commande, tu
peux essayer un truc du type :

#!/bin/bash


Ça commence mal :
$ /bin/bash
sh: /bin/bash: No such file or directory

fichier=/chemin_vers_ton_fichier/rapport_rec.txt

cat ${fichier} |
sed -e s/SUCCESS/OK/g |
sed -e s/INACTIVE/IN/g |
sed -e s/FAILURE/KO/g |
sed -e s/TERMINATED/TE/g >${fichier}


Ne JAMAIS faire ça !

Le « cat » est inutile, tu appelles quatre processus « sed » alor s qu'un
seul suffirait et le plus grave, c'est que $fichier va se retrouver
raccourci si sa taille est plus grande que le buffer utilisé.

et tu as juste a lancer le script pour que ca te fasse ta transfo
automatiquement
si le fichier est petit, ca ira, par contre si le fichier est gros, le
traitement risque de prendre bc plus de temps que les beaux scripts en
perl ^^


Je pense que tu voulais écrire l'inverse. Il est clair que les
performances en Perl sont bien moins bonne que celle de sed mais
personne ici n'a parlé de performance ou de fichier de grande taille.

--
Benoit Izac


je fais ca rapidement, maintenant c'est sur que tu peux te passer du
cat et faire un sed directement du type "sed -e machin sed -e machin
sed -e machin sed -e machine ${fichier} >${newfichier}

c'est ca que tu veux dire ?


Avatar
Benoit Izac
Bonjour,

le 13/05/2007 à 15:10, bull a écrit dans le message
:

je fais ca rapidement, maintenant c'est sur que tu peux te passer du
cat et faire un sed directement du type "sed -e machin sed -e machin
sed -e machin sed -e machine ${fichier} >${newfichier}

c'est ca que tu veux dire ?


Relis le message de Pascal.

--
Benoit Izac