Menu

Chercher un motif dans une ligne et le recopier a la fin de cette meme ligne [Résolu]

Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
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
Afficher la suite 

Votre réponse

3 réponses

Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
164
0
Merci
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 ;-\



Commenter la réponse de UnGnU
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
0
Merci
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.
Commenter la réponse de Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
0
Merci
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.
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
> Utilisateur anonyme -
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.

++
Utilisateur anonyme > Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
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 !
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
> Utilisateur anonyme -
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...
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
> Utilisateur anonyme -
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 ;-)
UnGnU
Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
164 > Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
j'utilise sed sous cygwin
Tu m'étonnes que ça merdoie ;-(
Commenter la réponse de Cobalt2225