Reecrire le nom de fin de ligne en debut de fichier

Résolu/Fermé
ewilanenmarchombre - 1 mars 2016 à 18:28
 ewilanenmarchombre - 2 mars 2016 à 12:56
Script Bash - Shell ou n'importe quoi si ça aide...

Bonjour,

J'ai un fichier (issue d' un logiciel qui ne me permet pas de changer le rendue malheureusement) qui m'affiche mes résultats sous la forme suivantes:

>blablablablabalbablablablablablabalbal [Toto titi]BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB>blablabla numero2 [Titi TATA]AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>blablablablablablablablablablablabla [Toto tutu]CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Bien entendue, le fichier s'étend sur plusieurs centaines de lignes sans aucun saut à la ligne...

Idéalement, j'aimerais arriver au résultat suivant:

>Toto_titi blablablablablablablablablablaablab
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
>Titi_TATA blablablablablablablablablablablabla
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>Toto_tutu blablablablablablablablablablablablablablablablablablablab
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Mais à la limite, je pourrais me contenter du resultat suivant

>Toto titi blablablablablablab BBBBBBBBBBBBBBBBB >Titi TATA blablablblablablablablabla AAAAAAAAAAAAAAAAAAAAAAA >Toto tutu blablablablablablablablab CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

Je suis assez débutante en Linux et je suis sur Debian ( si ça change quoi que ce soit...)

J'espère que quelqu'un pourra m'aider...

Cordialement et Merci d'avance

Ewi

A voir également:

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 mars 2016 à 18:50
Salut,

 $ cat plop 
>blablablablabalbablablablablablabalbal [Toto titi]BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB>blablabla numero2 [Titi TATA]AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>blablablablablablablablablablablabla [Toto tutu]CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC


$ sed 's/>/\n/g;s/[[]/\n>/g;s/[]]/\n/g' plop | sed -n '1d;h;n;s/ /_/g;G;s/\n/ /;N;p'
>Toto_titi blablablablabalbablablablablablabalbal
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
>Titi_TATA blablabla numero2
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>Toto_tutu blablablablablablablablablablablabla
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
2 mars 2016 à 08:21
Oups, je n'ai testé qu'avec une ligne et ça ne marchera pas s'il y en a plusieurs ;-(

La bonne syntaxe revue et corrigée :

sed 's/>/\n/g;s/[[]/\n>/g;s/[]]/\n/g' plop | sed -n '/^$/b;h;n;s/ /_/g;G;s/\n/ /;N;p'
0
ewilanenmarchombre
2 mars 2016 à 08:49
Merci vraiment beaucoup ça marche nickel par contre je n'ai vraiment pas du tout compris la structure de la formule "magique" que tu m'as noté, si à un moment tu as 15 sec pour m'indiquer ce que signifit chaque sous partie de ta ligne de commande je serais ravie...
Encore merci
Ewi
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > ewilanenmarchombre
2 mars 2016 à 09:26
 
sed 's/>/\n/g;s/[[]/\n>/g;s/[]]/\n/g' plop

Dans la 1ère commande, je fais en sorte d'afficher chaque sous-partie qui nous intéresse chacune sur une ligne.

s/>/\n/g
On substitue chaque signe ">" par un saut de ligne "\n" et ce autant de fois que nécessaire "g" sur une même ligne.

s/[[]/\n>/g
Idem pour les crochets ouvrants "[", qu'on remplace par un saut de ligne suivi d'un chevron ouvrant.

s/[]]/\n/g
Idem pour les crochets fermants "[", qu'on remplace par un saut de ligne.

 
sed -n '/^$/b;h;n;s/ /_/g;G;s/\n/ /;N;p'

La seconde commande, passée via un "pipe", permet de mettre en forme le texte.

-n
Option qui permet, en corrélation avec la commande "p", de n'afficher sur la sortie standard (l'écran) que ce qui nous intéresse.

/^$/b
Si on rencontre une ligne vide, on passe à la fin du script. En gros, on passe à la ligne suivante. (la commande précédente génère une ligne vide en remplaçant le 1er ">", d'où la nécessité de cette syntaxe)

h;
On place le contenu de la mémoire principale (1ère ligne lue non vide) dans une mémoire secondaire.

n;
On lit la ligne suivante. Le contenu précédent est remplacé par la ligne suivante sans être envoyé sur la sortie standard (absence de commande "p").

s/ /_/g;
Comme c'est la ligne contenant les noms, on substitue tous les espaces par des underscores.

G;
On récupère le contenu de la mémoire secondaire, que l'on ajoute au contenu de la mémoire principale (les deux lignes étant séparées par le caractère "\n"). En gros, on place les blabla après les noms.

s/\n/ /;
On substitue le caractère saut de ligne (\n) par une espace.

N;
On ajoute la ligne suivante au contenu de la mémoire principale.

p
On affiche le tout sur la sortie standard.
0
ewilanenmarchombre
2 mars 2016 à 12:56
Merci beaucoup, c'est très gentil à vous

Cordialement

Ewi
0