Sed : inserer pattern dans une ligne

Résolu
bijnok Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -  
bijnok Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -
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

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
bijnok Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   12
 
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?
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Parce que la syntaxe ne marche que dans la partie capture mais pas dans la partie de remplacement ;-(
0
bijnok Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   12
 
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
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
C="";B="0,";for ((i = 1;i <= ${nbZero}; i++));do C="$B$C";done

Puis ensuite :

sed 's/\([0-9],\)\{'"${position}"'\}/&'"${C}"'/g'
0
bijnok Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   12
 
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
0