Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/11/2017, à 21:37

L'Africain

(Résolu) Inverser lignes dans un fichier

Bonjour,
J'ai de multiples fichiers avec ceci dedans:

\s1 mon titre
\c 1
\p

Je voudrais mettre la ligne qui commence par \s après celle qui commence par \c. Sachant que le chiffre après le c et l'espace est à titre  d'exemple, il peut être doublé mais est toujours suivi d'un retour à la ligne.
Je me demandais si sed saurait faire ça.

Merci de votre aide.

Dernière modification par L'Africain (Le 06/11/2017, à 20:35)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 05/11/2017, à 22:01

pingouinux

Re : (Résolu) Inverser lignes dans un fichier

Bonsoir,
Essaye :

sed -n '/^\\s/{h;n};/^\\c/G;p' fichier

Et si tu veux juste échanger les 2 premières lignes :

sed -n '1{h;n;G};p' fichier

Édité : Simplification

Dernière modification par pingouinux (Le 05/11/2017, à 22:37)

Hors ligne

#3 Le 06/11/2017, à 10:25

L'Africain

Re : (Résolu) Inverser lignes dans un fichier

Salut,
Ça marche presque parfaitement!! Il y a juste deux légers problèmes smile
Les autres endroits du texte avec \s sont supprimés (car il y a des \s ailleurs que avant un \c) et j'avais oublié une petite variable, quelquefois après le \s il y a aussi un \p mais pas toujours or il faut le supprimer (uniquement dans le cas où il précède un \c). Pour ne pas avoir:

\p
\c
\s

J'ai essayer de le faire après avoir passé la première de tes commandes, avec cette commande:

sed -i 's/\\p\n\\c/\\c/g' test

Mais ça marche pas sad

Pourrais-tu aussi m'expliquer ce que je ne comprends pas dans ta commande comme le {h;n};. Le -n ça veut dire qu'il travaille sur les lignes visées et le G qu'il met le contenu de la première partie après le \c si j'ai bien compris; et le p final doit être le p du \p?

Merci encore pour ton aide.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#4 Le 06/11/2017, à 10:59

pingouinux

Re : (Résolu) Inverser lignes dans un fichier

Tes explications ne me paraissent pas limpides… Le mieux est que tu montres un petit fichier exemple contenant les différentes particularités, ainsi que le résultat que tu souhaites obtenir.

Pour l'explication de la commande, consulte déjà le man de sed, et demande ensuite si quelque chose ne te paraît pas clair.

Hors ligne

#5 Le 06/11/2017, à 11:32

L'Africain

Re : (Résolu) Inverser lignes dans un fichier

Ok désolé pour les explications troubles, je te mets un fichier plus fourni:

\s1 Maloba ma ebandela
\c 1
\p
\v 1 Bato basúsu babandákí kokoma maye malekákí o ntéi ya bísó.
...
\s1 Anzelú asangélí mbótama ya Yoáne Mobátisi
\p
\v 5 Zakaría, moto wa molongó mwa Abía *, azalákí nganga Nzámbe
(...)
\s1 Zábolo ayéí kosénginya Yézu
\p
\c 4
\p
\v 1 Yézu atóndí na Elímo Sántu, alongwí o Yordáne, Elímo akambí yě o elíkí,

Comme tu le vois ici, le \c 1 est précédé d'un titre \s et le \c 4 aussi avec une balise \p entre les deux. Enfin tu vois aussi dans le corps du texte un autre titre \s. La première commande que tu m'as donnée déplace bien le \s qui précède \c, mais supprime tous les autres \s qui ne sont pas suivi d'un \c.
Enfin dans le cas où le \s et suivi d'un \p avant le \c il faudrait également supprimer ce "\p" pour ne pas avoir

\p
\c 4
\s1 Zábolo ayéí kosénginya Yézu

Ce que j'ai essayé de faire avec la commande que je t'ai envoyé mais qui n'a pas fonctionné.


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#6 Le 06/11/2017, à 14:29

pingouinux

Re : (Résolu) Inverser lignes dans un fichier

Dans ce cas, essaye ce script python :

#! /usr/bin/python

import sys, re

bloc_spc=re.compile(r'^(\\s.*?\n)(\\p.*\n)?(\\c.*?\n)',re.M)

with open(sys.argv[1],'r') as f: fic=f.read()
with open(sys.argv[2],'w') as g:

   while True :
      k=bloc_spc.search(fic)
      if(k) :
         g.write(fic[:k.start(1)])
         g.write(k.group(3))
         g.write(k.group(1))
         fic=fic[k.end(3):]
      else :
         g.write(fic)
         break

À appeler ainsi :

./le_script.py fichier_in fichier_out

Hors ligne

#7 Le 06/11/2017, à 15:35

L'Africain

Re : (Résolu) Inverser lignes dans un fichier

Merci,
ça marche très bien sur un fichier unique. Comment faire pour qu'il s'applique sur plusieurs avec une boucle?


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#8 Le 06/11/2017, à 18:09

pingouinux

Re : (Résolu) Inverser lignes dans un fichier

Par exemple (en remplaçant fic* par ce qui va bien) :

for f in fic*; do ./le_script.py "$f" "$f".out; done

Hors ligne

#9 Le 06/11/2017, à 18:28

L'Africain

Re : (Résolu) Inverser lignes dans un fichier

Merci c'est ok!


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne