Sed : inserer pattern dans une ligne

Résolu
Bonjour,

Bonjour,

en shell, je souhaite inserer un certains nombre de champs après toutes les occurrences d'un pattern sur une même ligne.
Exemple:

position=5
nombreZero=3

#mo, fichier data contient:
BLABLABLA (1,2,3,4,5,6,7,8,9),(1,2,3,4,5,6,7,8,9), BLUBLU (1,2,3,4,5,6,7,8,9));

# le but est d'inserer trois 0 après cinq occurences de "chiffre," ce qui donnerait :

BLABLABLA (1,2,3,4,5,0,0,0,6,7,8,9),(1,2,3,4,5,0,0,0,6,7,8,9), BLUBLU (1,2,3,4,5,0,0,0,6,7,8,9));


J'ai essayé :
 more data  | sed '/{s/"[0-9],"{$position,}/"0,"{$nombreZero,}/g}' 


mais cela remplace la chaine 1,2,3,4,5, par 0,0,0, et je ne trouve pas le moyen d'ajouter mes zeros sans supprimmer le début... (1,2,3,4,5,.. ne reflète pas la réalité mais permet juste de repérer les positions dans cet exemple).
y a t'il un moyen de capturer le pattern
"[0-9],"{$position,}
pour ensuite le réinsérer avec les 0 ?? j'ai essayé avec sed mais pas moyen de trouver quelques choses qu fonctinnent ET qui me donne le résultat attendu.

Merci par avance à ceux qui liront,

Bijnok

1 réponse

  1. Modérateur
    Salut,

    sed 's/\([0-9],\)\{'"${position}"'\}/&0,0,0,/g'

    Par contre tu ne pourras pas définir le nombre de zéro dans l'expression par une variable, il faut mettre les occurrences en dur.
    1. Merci pour la capture et la backref.
      J'essaie de remplacer les 0,0,0, par une variable en la protégeant comme il faut mais pour l'instant je ne trouve pas, il semblerait que tu aies raison...

      J'ai vraiment besoin que cela soit dynamique, apparement je vais être obligé de me mettre à awk pour faire ce que je ouhaite.

      Merci Jicipy

      Pourquoi 0,0,0, ne peut être remplacé par
      '0,'\{"${nbZero}"\} 
      ? alors que j'arrive à remplacer 1,2,3,4,5, par 0,0,0, avec des variables protégées comme il faut?
    2. Modérateur
      Parce que la syntaxe ne marche que dans la partie capture mais pas dans la partie de remplacement ;-(
    3. Arrrrrrrrr !
      Je vais tenter autre chose du genre créer la ligne de commande sed dynamiquement puis l'interpréter.
      exemple:
      cat "sed 's/\([0-9],\)\{'"${position}"'\}/&" > test
      boucle sur $nbZero
              cat test "0," > test
      cat test "/g'" > test


      puis interpréter ce qu'il y a dans test.

      Encore merci
    4. Modérateur
      C="";B="0,";for ((i = 1;i <= ${nbZero}; i++));do C="$B$C";done

      Puis ensuite :

      sed 's/\([0-9],\)\{'"${position}"'\}/&'"${C}"'/g'
    5. Trop fort !
      Il faut combien d'années pour arriver à ce niveau là en shell ? Parce qu'on te retrouve souvent sur le forum et à chaque fois avec une solution propre et efficace...

      Merci encore à toi !!!

      Problème résolu

      ___Edit___
      NB : probleme si on cherche a ajouter les 0 en derniere position dans les parentheses; enlever 1 a position et remplacer B par B=",0" et dans sed mettre la virgule avant [0-9]

      ___Edit 2___
      ajouter une * après [0-9] pour matcher de vrais nombres