[expert][script][sed] Nieme occurence ?

Nieme occurence ? [expert][script][sed] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 16-08-2013 à 00:15:16    

:hello: bonjour
 
j'ai une question de la mort qui tue maudite...pour vrais experts donc  :D y'a défis là  :D  
vu sur un autre forum une question intéressante dont le but est avec sed
de sélectionner un texte entre deux mots mais le second peut exister plusieurs fois, il faut donc prendre la 3ième occurrence disons...
 
par exemple

truc machin bidule
pattern0
d
pattern1
e
pattern1
f
pattern1
g  
pattern1
chose foo bar


 
ça sélectionnerai uniquement :

pattern0
d
pattern1
e
pattern1
f
pattern1


 
 
le principe de boucle pour faire ça sur 2ième occurrence aurait la structure suivante :

Code :
  1. /motif1/ {                           
  2.     :z                               
  3.     N                                 
  4.     /motif2$/ !b z                   
  5.     :y                               
  6.     N                                 
  7.     /.*\nmotif2$/ !b y               
  8.     N                                 
  9.     p                                 
  10.     q                                 
  11. }


 
je me disais donc pour la troisième il suffit d'ajouter encore une boucle de saut supplémentaire. mais c'est idiot par principe parce que si un jour on devait faire la même chose pour la 100ième  occurrence... le script sed serai plus gros que le ficher à trier... ;)
 
y a t il un moyen de faire une boucle en indiquant de manière chiffrée le nombre d’occurrences ou de boucle à faire.
 


---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Marsh Posté le 16-08-2013 à 00:15:16   

Reply

Marsh Posté le 18-08-2013 à 16:27:53    

Bonjour, moi je sais pas, t'as droit à mettre ta commande sed dans un .sh ?

Reply

Marsh Posté le 18-08-2013 à 17:20:46    

Salut,
 
Une solution sûrement parmi d'autres...
 
Le fichier référence (plop) :

truc machin bidule
pattern0
d
pattern1
e
pattern1
f
pattern1
g  
pattern1
h
pattern1
i
pattern1
j
pattern1
k
pattern1
l
pattern1
m
pattern1
n
pattern1
o
chose foo bar


 
Le script sed (script.sed) :

Code :
  1. #n
  2. :z                                   
  3. N                                     
  4. $ !b z                               
  5. s/.*\(pattern0.*\)/\1/                   
  6. s/pattern1/&\n/10                 
  7. s/\n\n.*//p


 
Le résultat de la commande "sed -f script.sed plop" :

pattern0
d
pattern1
e
pattern1
f
pattern1
g  
pattern1
h
pattern1
i
pattern1
j
pattern1
k
pattern1
l
pattern1
m
pattern1


 
J'ai ciblé la 10ème occurrence (il y en a 11). Il n'y a qu'à changer le chiffre dans l'expression pour cibler l'occurrence de son choix  ;)  
 
Explications en gros.
 
le script charge tout le fichier dans le buffer principal de "sed".  

:z                                      
N                                      
$ !b z


 
Puis on élimine tout ce qui se trouve avant le 1er motif de référence.  

s/.*\(pattern0.*\)/\1/


 
On place un "tag" (ici j'ai choisi de rajouter une fin de ligne (\n) ce qui nous en fait 2 consécutives) après la 10ème occurrence du 2nd motif.  

s/pattern1/&\n/10


 
Et pour finir on supprime le "tag"  et tout ce qui se trouve après lui.

s/\n\n.*//p



---------------
$ man woman
Reply

Marsh Posté le 18-08-2013 à 18:23:05    

merci pas mal..


---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Marsh Posté le 19-08-2013 à 18:10:07    

Tiens encore plus simple, avec un branchement conditionnel (si une substitution n' a pas été opérée, alors on boucle) :
 

Code :
  1. cat script.sed


#n
/pattern0/{
:z
N;
s/pattern1/&/4
Tz
p
}


 

Code :
  1. sed -f script.sed plop

 

pattern0
d
pattern1
e
pattern1
f
pattern1
g  
pattern1


 ;)


---------------
$ man woman
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed