Sed : inserer pattern dans une ligne

Résolu/Fermé
bijnok Messages postés 65 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 6 octobre 2015 - 26 mai 2010 à 09:59
bijnok Messages postés 65 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 6 octobre 2015 - 26 mai 2010 à 11:50
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
26 mai 2010 à 10:37
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 65 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 6 octobre 2015 12
Modifié par bijnok le 26/05/2010 à 11:03
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
26 mai 2010 à 11:17
Parce que la syntaxe ne marche que dans la partie capture mais pas dans la partie de remplacement ;-(
0
bijnok Messages postés 65 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 6 octobre 2015 12
26 mai 2010 à 11:27
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
26 mai 2010 à 11:43
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 65 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 6 octobre 2015 12
Modifié par bijnok le 26/05/2010 à 12:29
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