Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/07/2008, à 11:33

Totor

[résolu] sed "complexe"

Bonjour,

Je galère avec sed pour effectuer une suppression de ligne dans un fichier avec la condition suivante :
"supprimer toutes les lignes commençant par A79 et qui ont en colonne 174 les valeurs 00020 ou 00021 mais je ne dois pas supprimer celles qui commencent par A7902699A et A7902799A"

La difficulté réside aussi dans le fait que les actions sed sont dans un fichier appelé par un script shell mais je ne dois absolument pas modifié ce script.

Pour corser la difficulté, sed est appelé sans l'option -r (enfin, je sais pas trop si c'est plus difficile sans cette option en fait roll).

J'ai contourné le pb comme suit :

contenu de mon fichier test (test.src) :

A7902699AT                                                                                                                                                                   00020
A7902699AT                                                                                                                                                                   00021
A7902699AT                                                                                                                                                                   00019
A7903123AT                                                                                                                                                                   00020
A7902799AT                                                                                                                                                                   00020
A7902799AB                                                                                                                                                                   00021
A8001234AC                                                                                                                                                                   00020

mon fichier contenant les instructions sed (test.sed) :

s/^A79\(02699A\|02799A\)/A--\1/
/^A79.\{170\}\(00020\|00021\)/d
s/^A--/A79/

(pour tester : sed -f test.sed test.src)

Est-il possible de faire autrement qu'en renommant les lignes commençant par A7902699A et A7902799A ?

Dernière modification par Totor (Le 03/07/2008, à 15:26)


-- Lucid Lynx --

Hors ligne

#2 Le 03/07/2008, à 12:17

Alain.g

Re : [résolu] sed "complexe"

Salut

Je dirais que ça dépend de la version de sed : avec ssed ("super sed", dispo dans les dépôts) c'est facilement faisable comme celui implémente les PCRE (option -R), ce qui permet ici d'utiliser les assertions avant négatives (?!…) :

^A79(?!02699A|02799A) : signifie commençant par A79 et ne contenant à droite ni 02699A ni 02799A

Donc ça devrait donner :

ssed -R '/^A79(?!02699A|02799A).{170}000(20|21)/d' test.src

Edit : si tu ne peux pas utiliser ssed mais que tu peux utiliser Perl :

perl -lne 'print unless /^A79(?!02699A|02799A).{170}000(?:20|21)/' test.src

Dernière modification par Alain.g (Le 03/07/2008, à 12:28)


Xubuntu Karmic !

Hors ligne

#3 Le 03/07/2008, à 12:37

Totor

Re : [résolu] sed "complexe"

Malheureusement, installer ssed m'est quasiment impossible car je ne maitrise pas l'installation sur les serveurs (dans le sens où je n'en ai pas l'autorisation) mais aussi car la procédure de demande et de mise en oeuvre sont très longues (et lourdes) dans mon environnement professionnel. hmm

Pour le moment, ma solution remplie le rôle demandée, et ça convient à la MOA...

mais juste par curiosité, si qlq'1 à une meilleure solution avec mes contraintes, je suis preneur !

sinon :

sed -V
GNU sed version 4.0.7
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

-- Lucid Lynx --

Hors ligne

#4 Le 03/07/2008, à 12:39

Totor

Re : [résolu] sed "complexe"

malheureusement non,  je ne peux pas modifier le batch qui utilise sed et je ne peux qu'agir sur le fichier contenant les instructions sed. hmm


-- Lucid Lynx --

Hors ligne

#5 Le 03/07/2008, à 15:25

Totor

Re : [résolu] sed "complexe"

Avec persévérance, j'ai trouvé une autre solution qui me convient mieux car plus explicite big_smile :
fichier test.sed :

/^A79\(02699A\|02799A\)/{p;D}
/^A79.\{170\}000\(20\|21\)/d

EDIT : merci ccm

Dernière modification par Totor (Le 03/07/2008, à 15:30)


-- Lucid Lynx --

Hors ligne