au pire on peut ruser un peu pour palier au problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /toto/{s/toto/tata/g;n} /tata/{s/tata/titi/g;n}
au pire on peut ruser un peu pour palier au problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /toto/{s/toto/tata/g;n} /tata/{s/tata/titi/g;n}
Non, ça ne fonctionne pas avec toto titi tata:
PS: sinon /toto/{s/toto/tata/g;n} est simplifiable en s/toto/tata/g;t
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $ echo toto titi tata | sed '/toto/{s/toto/tata/g;n};/tata/{s/tata/titi/g;n}' tata titi tata
Pour contourner le problème soulevé:
Ici, un mot remplacer par une regex ne sera pas remplacé par une autre regex...
Code : Sélectionner tout - Visualiser dans une fenêtre à part paste -d "/" valeurdepart valeurarrive | { sed -e 's:.:&\\n:g;:b;s:\\n\(.*/\):\1:;tb;s:.*:s/&/g:' ; echo 's/\n//g' ; } | sed -f - fichier_a_traiter
impressionnante ta commande disedorgue elle est très puissante.
J'essaie de la décortiquer pour bien comprendre mais je suis dépassé, peux-tu me donner une explication?
Encore merci et c'est vraiment impressionnant la puissance de cet outil
Bien cordialement
Laquelle veux-tu que j'explique et qu'est-ce que tu ne comprends pas ?
Salut,
c'est la commande sed:
je suis bien évidemment allé chercher la signification des différentes options que je ne connaissais pas mais je n'arrive pas à la décomposer et bien comprendre les différentes étapes de cette commande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sed -e 's:.:&\\n:g;:b;s:\\n\(.*/\):\1:;tb;s:.*:s/&/g:'
Les : servent à remplacer le / ? Je suis un peu perdu.
Merci
Oui, les ':' remplace bien les '/' ici. Si on décompose le sed, ça se présente comme ceci:
1) s:.:&\\n:gici à chaque caractère de la ligne on lui rajoute la chaine '\n' que le deuxième sed interprètera comme étant le newline.
2a) :bici on déclare une référence (ou point d'ancrage) que l'on appelle 'b'.
2b) s:\\n\(.*/\):\1:ici on retire la première chaine '\n' rencontré dans la chaine à gauche du '/'.
2c) tbon retourne à la référence 'b' si la dernière commande de substitution (donc ici, la ligne juste au dessus) à bien fait un replace.
3) s:.*:s/&/g:ici, on fabrique la commande de substitution pour le 2éme sed.
Et donc, si on décompose par exemple avec la ligne:
1) transformera la ligne en la chaine t\no\nt\no\n/\nt\ni\nt\ni\n .
Code : Sélectionner tout - Visualiser dans une fenêtre à part toto/titi
2a,2b,2c) transformeront au finale la chaine en toto/\nt\ni\nt\ni\n .
3) transformera la chaine en s/toto/\nt\ni\nt\ni\n/g qui sera donné au second sed en tant que commande.
Pour le second sed, c'est comme si on lui avait fourni un fichier de commande qui contient la commande s/toto/\nt\ni\nt\ni\n/g et la commande venant du echo 's/\n//g' à exécuter sur le fichier à traiter.
Le s/\n//g est la pour supprimer tous les '\n' que l'on avait rajouté et pas encore supprimé.
Il faut savoir qu'en sed, le newline ( '\n' ) est le seul caractère que l'on ne rencontrera pas lors de la lecture d'une ligne puisque c'est lui qui marque la fin d'une ligne.
Merci beaucoup diserdogue pour cette explication, je n'y connais pas grand chose mais c'est vraiment une approche ingénieuse de mon problème.
Encore merci et sûrement à une prochaine
Cordialement
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager