Syntaxe commande sed avancée

julien -  
 julien -
Bonjour à tous,

je souhaiterait substituer des caractères de façon a faire (mettons que j'ai une variable avec des plein de chiffres) de 1 à 5 remplaçer par a, de 7 à 8, remplacer par b,ect.. j'ai vu la commande sed qui n'a pas l'air mal mais j'arrive pas a saisir la syntaxe pour arriver a ce résultat. avez vous une solution? merci d'avance.

7 réponses

Résumé de la discussion

Substitution de caractères avec sed: comment remplacer certains chiffres par des lettres dans une chaîne stockée en variable, en particulier lorsque l’objectif est de mapper des groupes de chiffres à des lettres distinctes. La solution efficace proposée consiste à enchâsser deux substitutions sed: s/[1235]/a/g pour 1,2,3 et 5, puis s/[679]/b/g pour 6,7 et 9, ce qui convertit 123456789 en aaa4abb8b. Des échanges complémentaires évoquent des variantes selon l encodage, des opérateurs alternatifs et des contraintes liées à des chiffres en octal ou à des versions de bash, sans changer le principe central.

Bobot (l'IA à votre service)
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ sed 's/[1235]/a/g;s/[679]/b/g' <<<"123456789"
    aaa4abb8b
    1
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Merci de poster un exemple concret AVANT => APRÈS de ce que tu veux exactement.

    0
  3. julien
     
    ben par exemple j'ai des truc comme /251,/252,/253 et je veux remplacer par exemple /251 et 252 par a et /253 par b, le tout en une ligne, parceque j'ai beaucoup de chiffres, (c'est des caractères spéciaux en octal) et du coup je peux pas faire le sed äàéèëê/aaeeee
    0
    1. julien
       
      en me relisant, je me rend compte que mon exemple n'est pas clair. c'est dur a expliquer. on a une variable 123456789, il faut remplacer 1,2,3,5, par a et 6,7,9 par b
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      C'est encore moins clair comme ça ;-(((

      On en fait quoi du "4" et du "8" ???

      Un exemple concret !
      0
    3. prefix
       
      zipe....tu dors?^^
      mais il est vrai que c'est tres tres avancé....
      0
  4. julien
     
    c'est sur que ç'est bien prise de tête. j'ai chopé un mal de tête hier je vous raconte pas. enfin dubcek merci infiniment ta réponse m'avance bien. ce qui serait parfait c'est si on pouvait écrire de 1 à 5, remplacer par a, sans avoir a tout saisir, (comme dans tr '[a-z]' '[A-Z]' ) car en vrai j'ai des caractères comme /251 , /252, /253 qui peuvent apparaitre aléatoirement (caractère spéciaux norme ISO-8859-1) que je doit remplacer par exemple de /340 à / 345, remplacer par a, de /350 à /353, par e, ect... bon après ta solution reste largement viable, mais bon la ligne qui fait une page ^^ en tout cas merci c'est déja ça.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      $ echo "/251,/252,/253, /351,/352,/353" | sed 's#25[1-3]#a#g;s#35[1-5]#e#g'
      /a,/a,/a, /e,/e,/e
      
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      ou avec des intervalles
      $ r1=$(echo  /25{1..5}); r1="("${r1// /|}")"; echo $r1
      (/251|/252|/253|/254|/255)
      $ 
      $ r2=$(echo  /35{1..5}); r2="("${r2// /|}")"; echo $r2
      (/351|/352|/353|/354|/355)
      $ 
      $ echo "/251,/252,/253, /351,/352,/353" | sed -r "s+"${r1}"+a+g;s+"${r2}"+b+g"
      a,a,a, b,b,b
      $ 
      
      0
    3. julien
       
      je suis sous bash aussi. ptet ça peu aider, parcque la j'ai "no such file directory".
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      dans quel cas ?
      0
    5. julien
       
      le cas la : $ r1=$(echo /25{1..5}); r1="("${r1// /|}")"; echo $r1
      (/251|/252|/253|/254|/255)
      $
      $ r2=$(echo /35{1..5}); r2="("${r2// /|}")"; echo $r2
      (/351|/352|/353|/354|/355)
      $
      $ echo "/251,/252,/253, /351,/352,/353" | sed -r "s+"${r1}"+a+g;s+"${r2}"+b+g"
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. julien
     
    merci pour ces réponses rapides, mais malheuresement, j'ai essayé avec la syntaxe de dubcek :

    var=$(echo $var | sed "s/[\340\341\342\343\344\345]/a/g;s/[\350\351\352\353]/e/g;")

    elle est correcte syntaxiquement mais quand on met tout bah si on tombe sur une valeur (ex: /351) le remplacement ne s'effectue pas.

    pour la solution de zipe, plus condensée, j'ai fé ça:

    var=$(echo $var | sed "s#34[0-3]#a#g;s#35[0-3]#e#g") et la blague c'est que ça fé pareil, quand on tombe dessus ça ne remplace pas. par contre les /a,/a,/a, /e,/e,/e ne passent pas. j'ai donc fait sans.
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    [a-z] ne fonctionne qu'avec un seul caractère à la fois. moi je fabrique une séquence de ou : (aaa¦bbb¦ccc) aaa ou bbb ou ccc
    sed "s/[\340\34 : ceci veut dire ou 3 ou 4 ou 0 etc
    0
  8. julien
     
    en fait ça var=$(echo $var | sed "s#34[0-5]#a#g;s#35[1-5]#e#g") ça passe mais sans le \. quand je le met var=$(echo $var | sed "s#\34[0-5]#a#g;s#\35[1-5]#e#g") il me renvoie invalid back reference.
    0
    1. julien
       
      ça doit venir de ces caractères d'echappement pourris.
      0
    2. julien
       
      invalid back reference qui ne porte evidamment que sur ";" et bien sur que quand je met \

      quel bord**
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon, on reprend !!!

      Y'a quoi dans "$var" au départ ???
      0
    4. julien
       
      un mot au pif. avec des fois, des caractères spéciaux en iso 8859-1. je cherche a les remplacer par des caractères normaux. (virer tout les accents).
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ben justement, on peut avoir un exemple de ce mot au pif en iso 8859-1 ?
      0