Chercher un motif dans une ligne et le recopier a la fin de cette meme ligne

Résolu/Fermé
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 - Modifié le 10 déc. 2018 à 11:06
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 - 11 déc. 2018 à 11:46
Bonjour,

Je pense que ce que je souhaite faire est faisable avec une commande sed, mais je n'ai pas le niveau pour résoudre moi meme ceci ... du coup, je vous demande de l'aide !

Mon objectif :
J'ai un fichier qui contient ces lignes :

BFH0000000101SHJALL220PROD1811040615BH000155
BKT0000000406000001 006160 SABR160ZEOCYHNXHD
BKS00000005241811030000011602968945217 3VVVV 07200034 CANX 0000
BKP0000000884181103000001VD 0000000000{ 0000000000000000{
BKT0000001006000002 011071 SABR
BKS00000011241811030000020712968945218 5FVVV 07200034 TKTT0000
BKP0000002084181103000002CA 0000008470{ 0000000000008470{
BKT0000002106000003 013176 SABR

Pour toutes les lignes contenant ce motif : ^.\{11\}\(84\)
(En claire, les lignes qui commencent par 11 caracteres quels qu'ils soit, suivi de 84.)
Alors, je dois recopier la chaine qui commence a la position 36 de cette ligne et qui fait 11 caracteres a la fin de cette meme ligne. Les autres lignes restent présentes et ne doivent pas etre touchées.

Si vous pouvez me donner cette commande, ce serait salavateur ...

Je continue a chercher ... mais je le sens mal ;-)

MERCI !

PS : dans le fichier original, c'est la position 36, mais les espaces sont supprimer sur l'affichage dans cette page web, du coup la chaine en question semble commencer a la position 28 ... mais ca change pas grand chose ;-)

et du coup, voici le fichier en sortie :
BFH0000000101SHJALL220PROD1811040615BH000155
BKT0000000406000001 006160 SABR160ZEOCYHNXHD
BKS00000005241811030000011602968945217 3VVVV 07200034 CANX 0000
BKP0000000884181103000001VD 0000000000{ 0000000000000000{ 0000000000{
BKT0000001006000002 011071 SABR
BKS00000011241811030000020712968945218 5FVVV 07200034 TKTT0000
BKP0000002084181103000002CA 0000008470{ 0000000000008470{ 0000008470{
BKT0000002106000003 013176 SABR

Configuration: Windows / Chrome 70.0.3538.110

3 réponses

UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
10 déc. 2018 à 13:10
Salut,

C'est c*n, j'avais la solution, mais vu ta façon de répondre, ben t'as qu'à te creuser les méninges ;-\



0
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018
10 déc. 2018 à 13:15
Salut UnGnU,

Sache que lapiel me pourri systématiquement tous les posts que je fais avec des réponses a la con.
Donc, tres clairement, il me tape sur le systeme.

Je ne prends donc plus de gants avec cet abruti, j'en ai déja pris pas mal dans mes précedents posts.

D'ailleurs, tous ses messages ont éte retriré par le moderateur.
0
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018
10 déc. 2018 à 14:46
Bon, ben, pour la postérité... mon probléme est résolu ...
je poste la soluce quand même pour quelqu'un qui galererai aussi.

Cette soluce fonctionne sur un fichier dont le noombre de caractere sur une ligne specifique est toujours le meme, ce qui est le cas pour moi.

sed -i '/^.\{11\}84/ s/\(^.\{35\}\)\([0-9]\{10\}\){\(.\{90\}\)/\1\2{\3\2A/g' monfic.txt

en gros, cette commande rajoute, uniquement dans la ligne qui commence par 11 caracteres quelconque suivi de 84, le motif specifique constitué de 10 Nombres -- \([0-9]\{10\}\) -- et du caractére "{" situé a lémplacement 35 de la ligne, elle rajoute donc ce meme nombre en fin de ligne, en substituant le "{" par un "A" ... ce que je voulais faire.

J'etais un peu en galere avec le saut de ligne, mais j'ai contourné le probleme car je connaissais la longeur exacte de ma ligne ... ce qui m'a permis de résoudre mon probléme.

Pour info, ceux qui n'ont rien a apporter a une discussion devraient franchement se taire.

Merci pour vos non réponses.
0
Utilisateur anonyme
10 déc. 2018 à 15:13
sed -i '/^.\{11\}84/ s/^.\{35\}\([0-9]\{10\}\).*/&\1/'

alors ? t'as fini par comprendre que les parenthèses étaient mal utilisées/placées.

pour la postérité, mets ton message en « résolu », et utilise les balises CODE.
0
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 > Utilisateur anonyme
10 déc. 2018 à 15:24
en réalité, le pattern etait une copie sans nettoyage d'un pattern un peu plus complexe ou les parentheses avaient leur interet : (patterns=^.\{11\}\(01\|06\|24\|84\))

Mais franchement, meme si les parentheses etaient inutiles, elles ne nuisent pas au résultat.

La, tu n'apporte aucune solution, tu me prends pour un c*n ... quand tu apporte une solution, c'est que je l'ai deja. Bref, hors sujet complet.

Par ailleurs, la réponse que tu apporte, une fois le sujet déja résolu, est mauvaise, car le pattern est recopié sur une nouvelle ligne ... erreur que j'ai eu toute la matinée...

Mais merci quand meme, cette response est la moins mauvaises de toutes.

++
0
Utilisateur anonyme > Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018
Modifié le 10 déc. 2018 à 17:27
mékeskidi ?
$ fichier () 
{
echo "BFH0000000101SHJALL220PROD1811040615BH000155
BKT0000000406000001 006160 SABR160ZEOCYHNXHD
BKS00000005241811030000011602968945217 3VVVV 07200034 CANX 0000
BKP0000000884181103000001VD 0000000000{ 0000000000000000{
BKT0000001006000002 011071 SABR
BKS00000011241811030000020712968945218 5FVVV 07200034 TKTT0000
BKP0000002084181103000002CA 0000008470{ 0000000000008470{
BKT0000002106000003 013176 SABR"
}
$ fichier | sed '/^.\{11\}84/s/^.\{28\}\(.\{11\}\).*/& \1 # où le pattern est sur une nouvelle ligne ?/'
BFH0000000101SHJALL220PROD1811040615BH000155
BKT0000000406000001 006160 SABR160ZEOCYHNXHD
BKS00000005241811030000011602968945217 3VVVV 07200034 CANX 0000
BKP0000000884181103000001VD 0000000000{ 0000000000000000{ 0000000000{ # où le pattern est sur une nouvelle ligne ?
BKT0000001006000002 011071 SABR
BKS00000011241811030000020712968945218 5FVVV 07200034 TKTT0000
BKP0000002084181103000002CA 0000008470{ 0000000000008470{ 0000008470{ # où le pattern est sur une nouvelle ligne ?
BKT0000002106000003 013176 SABR
si tu ne donnes pas toutes les informations, tu n'auras pas toute la réponse !
0
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 > Utilisateur anonyme
11 déc. 2018 à 09:12
A la fois, si tu sais pas lire :
Alors, je dois recopier la chaine qui commence a la position 36 de cette ligne et qui fait 11 caracteres a la fin de cette meme ligne.

UnGnU, lui, il avait compris, c'est la difference.

Par mes posts, je ne souhaite vraiment pas te faire perdre ton temps.
Si tu ne sais pas, si tu ne veux pas ou si tu n'as pas le temps de répondre, alors tu laisse tomber le post.

Par contre, quand tu commence a faire des commentaires désobligeant pour te la jouer "sachant" et ne pas faire avancer d'un chouia le sujet, la, tu dépasse les bornes.

Et comme jusqu'ici, a chacun de mes trois posts, tu as fais la meme chose, a moment, je te dis : STOP.

Prends exemple sur UnGnU, lui, il a pas vraiment compris le pourquoi de ma réaction avec toi, mais lui, quand il répond, il est courtois et précis dans ses réponses. Tu as bcp a apprendre de lui jeune padawan...
0
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 > Utilisateur anonyme
Modifié le 11 déc. 2018 à 09:25
et sinon, je te confirme bien que ta commande :
sed -i '/^.\{11\}84/ s/^.\{35\}\([0-9]\{10\}\).*/&\1/' temp2.txt

retourne bien le paterne sur une nouvelle ligne dans mon fichier ... (j'utilise sed sous cygwin ... je ne sais pas si ca peut faire la difference, mais pour moi, ca ne marche pas.




Mais comme j'ai une autre commande qui marche, c'est tout bon, j'ai noté le post en résolu ... donc, pas la peine de se prendre plus la tete ;-)
0