Reecrire le nom de fin de ligne en debut de fichier [Résolu/Fermé]

Signaler
-
 ewilanenmarchombre -
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

1 réponse

Messages postés
35696
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
22 octobre 2020
5 559
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

Messages postés
35696
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
22 octobre 2020
5 559
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'

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
Messages postés
35696
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
22 octobre 2020
5 559 > ewilanenmarchombre
 
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.

Merci beaucoup, c'est très gentil à vous

Cordialement

Ewi