Sed substitute

Résolu/Fermé
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 19 juin 2007 à 22:14
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 21 juin 2007 à 08:58
Hello,

Je remplace tous les espaces composés de min. 5 espaces par ";" : avec la commande sed :

sed "s/ \{,5\}/;/g" fich1.txt>fich2.txt

Mais je dois introduire une restriction supplémentaire : Càd la même action qu'ici avant mais en ignorant les 50 premiers caractères??

Je sais que l'on peut dire à sed d'adresser les occurences mais ici ce n'est pas a partir de la 2 ou 3ème occurence mais à partir du 50ème caractère...

D'avance merci.

8 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
19 juin 2007 à 22:58
Salut,

Bon perso déjà l'expression primaire ressemblerait plutôt à ça :
sed -r 's/[ ]{5,}/;/g'
Mais bon si ça marche chez toi...

Ensuite histoire qu'on s'entende bien, peux-tu s'il te plaît poster un bout de ton fichier d'entrée ainsi qu'un aperçu du résultat escompté, merci.

;-))
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
20 juin 2007 à 09:14
Bonjour jipicy et les autres!!!

1) J'ai esayé ton code et là où le mien fonctionne le tiens semble remplaccer chaque espace par un ";" et donc quand j'ai 5 espaces j'ai : ;;;;; .

2) Voilà un exemple que souhaite réaliser :

Avant traitement :

Ref0044 arezdvfhjfugyuo zz dat1 1236 dat2 8886 dat3 9999
Ref0114 arezdvfjgdfkhgk mm dat1 1236 dat2 8886 dat3 9999
Ref0124 arrrrrruioyhyugi er dat1 1236 dat2 8886 dat3 9999

Après traitement :

Ref0044 arezdvfhjfugyuo zz dat1;1236;dat2;8886;dat3;9999
Ref0114 arezdvfjgdfkhgk mm dat1;1236;dat2;8886;dat3;9999
Ref0124 arrrrrruioyhyugi er dat1;1236;dat2;8886;dat3;9999

Voilà donc un exmple, j'espère avoi été plus clair

Merci.
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 895
20 juin 2007 à 09:34
Voilà donc un exmple, j'espère avoi été plus clair
Dans les explications oui mais pas dans les exemples !!! On voit pas les espaces ;-(
Voilà à quoi ressemble ton fichier, tous les espaces sont identiques
Ref0044 arezdvfhjfugyuo zz dat1 1236 dat2 8886 dat3 9999
Ref0114 arezdvfjgdfkhgk mm dat1 1236 dat2 8886 dat3 9999
Ref0124 arrrrrruioyhyugi er dat1 1236 dat2 8886 dat3 9999
Alors que si il existe des tabulations ou plus d'un espace, on verra :
Ref0044 arezdvfhjfugyuo zz dat1     1236     dat2     8886     dat3     9999
Ref0114 arezdvfjgdfkhgk mm dat1     1236     dat2     8886     dat3     9999
Ref0124 arrrrrruioyhyugi er dat1     1236     dat2     8886     dat3     9999
Colles tes exemples entre les balises "code" (le bouton Code) s'il te plaît. ou alors poste sur Cjoint.

Merci ;-))
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
20 juin 2007 à 10:28
<code>
Avant traitement :

Ref0044 arezdvfhjfugyuo zz dat1 1236 dat2 8886 dat3 9999
Ref0114 arezdvfjgdfkhgk ee dat1 1236 dat2 8886 dat3 9999
Ref0124 arrrrrruioyhyugi er dat1 1236 dat2 8886 dat3 9999

Après traitement :

Ref0044 arezdvfhjfugyuo zz dat1;1236;dat2;8886;dat3 9999
Ref0114 arezdvfjgdfkhgk aa dat1;1236;dat2;8886;dat3 9999
Ref0124 arrrrrruioyhyugi er dat1;1236;dat2;8886;dat3 9999

Efait, je ne remplace que les espaces à partir du 60ème caratère!

BAT
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
20 juin 2007 à 10:33
Avant traitement : 

Ref0044      arezdvfhjfugyuo      zz            dat1 1236 dat2 8886 dat3 9999 
Ref0114      arezdvfjgdfkhgk      mm         dat1 1236 dat2 8886 dat3 9999 
Ref0124      arrrrrruioyhyugi      er             dat1 1236 dat2 8886 dat3 9999 
  
Après traitement : 

Ref0044      arezdvfhjfugyuo      zz            dat1;1236;dat2;8886;dat3 9999 
Ref0114      arezdvfjgdfkhgk      mm         dat1;1236;dat2;8886;dat3 9999 
Ref0124      arrrrrruioyhyugi       er            dat1;1236;dat2;8886;dat3 9999 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
20 juin 2007 à 10:40
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 895
20 juin 2007 à 13:34
[jp@MDK tmpfs]$ cat exemple.txt

Ref0044      arezdvfhjfugyuo      zz             dat1      1236      dat2      8886      dat3      9999
Ref0044      arezdvfhjfugyuo      zz             dat1      1236      dat2      8886      dat3      9999
Ref0044      arezdvfhjfugyuo      zz             dat1      1236      dat2      8886      dat3      9999

[jp@MDK tmpfs]$ sed -e :loop -e 's/^\(.\{53,\}\)[ ]/\1;/;tloop' -e 's/;\+/;/g' exemple.txt

Ref0044      arezdvfhjfugyuo      zz             dat1;1236;dat2;8886;dat3;9999
Ref0044      arezdvfhjfugyuo      zz             dat1;1236;dat2;8886;dat3;9999
Ref0044      arezdvfhjfugyuo      zz             dat1;1236;dat2;8886;dat3;9999

[jp@MDK tmpfs]$ 
;-))
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
21 juin 2007 à 08:30
Merci jipicy,

Pourrais tu m'expliquer ce code stp?? Afin que je puisse comprendre et evoluer un peu plus!

(Je pourrais ainsi la modifier pour qu'elle remplace par ; quà partir du moment où j'ai min 3 espaces.., car ici elle remplace tous les espaces..)

sed -e :loop -e 's/^\(.\{53,\}\)[ ]/\1;/;tloop' -e 's/;\+/;/g' exemple.txt

1) LE -e indique à sed d'exécuter les commandes en PIPE;
2) :loop est un LABEL sur lequel on boucle grace à tloop
3) Sed "MATCHES" tous les caractères depuis le début de ligne jusqu'au 53ème

4) \1; ===> ????????????????????????????????????

5) ;\+ ===> ????????????????????????????????????

BAT, merci
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 895
21 juin 2007 à 08:49
Re-

4) \1 ===> Fait référence à la 1ère sous-expression.
Une sous-expression est une partie d'expression régulière que l'on souhaite réutiliser dans la chaîne de remplacement, elle est délimitée par des parenthèses protégées (ou pas si on utilise le switch "-r").
Ainsi "\1" fait référence à la 1ère, "\2" à la seconde, etc...

5) ;\+ ===> Une ou plusieurs occurrence(s) du caractère précédent. Équivalent de "\{1,\}"
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
21 juin 2007 à 08:58
MERCI+++

BONNE JOURNEE
0