Sed : ligne précédant celle identifié

Résolu/Fermé
nono58 - 13 mars 2009 à 17:14
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 mars 2009 à 10:24
Bonjour,
Je souhaiterais traité la ligne précédant la ligne contenant un caractère reconnaissable avec sed (ou autre si il y a ;-) mais je ne sait pas comment la récupérer. La fonction i\ permet d'inséré, mais cela me créer une nouvelle ligne, mais pas de modifier la précédente...

Plus concretement, j'ai des nombres sur une première ligne qui continu sur une second avec un signe * de continuation de données sur cette seconde ligne. j'aurais besoin de supprimer cet *, et d'avoir -- en fin de première ligne et ce de manière récusive dans un fichier

Exemple :

texte initial
1 25 3 45 2 68 4 95
* 5 85 6 24 1 45

texte voulu
1 25 3 45 2 68 4 95 --
5 85 6 24 1 45

D'avance merci pour toutes les aides et bon WE aussi...

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
13 mars 2009 à 17:46
Salut
Tu peux utiliser
sed 'N; s/--\n/\n* /g' fichier

Cdlt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
13 mars 2009 à 21:14
Je corrige ma solution, j'ai confondu ton fichier de départ avec celui d'arrivée.
Ca serait donc plutôt :
sed 'N; s/\n\* / --\n/g' fichier
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
13 mars 2009 à 20:50
Salut,

Au cas ou tu aurais aussi des lignes ne se continuant pas sur l'autre lignes :
[tmpfs]$ cat nono
1 25 3 45 2 68 4 95
* 5 85 6 24 1 45
1 25 3 45 2 68 4 94
1 25 3 45 2 68 4 93
* 5 85 6 24 1 45
1 25 3 45 2 68 4 92
1 25 3 45 2 68 4 91
1 25 3 45 2 68 4 90
* 5 85 6 24 1 45

[tmpfs]$ sed 'N;/\n\* /{s//--\n/;b};P;D' nono
1 25 3 45 2 68 4 95--
5 85 6 24 1 45
1 25 3 45 2 68 4 94
1 25 3 45 2 68 4 93--
5 85 6 24 1 45
1 25 3 45 2 68 4 92
1 25 3 45 2 68 4 91
1 25 3 45 2 68 4 90--
5 85 6 24 1 45

[tmpfs]$
;-))
0
Merci Jipicy pour la réponse, ça marche nickel. Dans le man de sed, je ne suis pas sur d'avoir bien compris les explications des N;P;D; utilisés... Si tu as quelques minutes pour m'éclairer, merci bien.

Merci également à fiddy pour son aide. Sa réponse fonctionnait à la première occurence. Je n'ai chercher en détails pourquoi, mais l'explication du P et D utilisés devrait y parvenir ???
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > nono58
16 mars 2009 à 09:12
Re-

Voir dans la FAQ : SED - Les commandes avancées
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 mars 2009 à 09:26
sed '
N             # On ajoute la ligne suivante dans l'espace de travail
/\n\* / {     # Si on trouve une fin de ligne suivie d'un astérisque
s//--\n/      # on substitue cette fin de ligne suivie d'un astérisque par 
              # 2 tirets suivis d'une fin de ligne
b             # et on se branche à la fin du script (après l'accolade fermante)
}
P             # Si aucune correspondance à la regex n'a été trouvée, on affiche
              # la 1ère partie de l'espace de travail (jusqu'à la fin de ligne (\n)
D             # on l'efface et on reprend le cycle en haut en ajoutant une nouvelle ligne

'
0
nono-58 Messages postés 1 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 16 mars 2009
16 mars 2009 à 10:19
Merci pour les explications personnalisées, c'est encore mieux...
Je ne sais pas trop comment clore le sujet, étant anonyme à la création du post.
0
Autant pour moi, il y a de très bonnes explications dans les astuces du site :o)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 mars 2009 à 10:24
Puisque ma version, ne marchait que sur la première occurence, la voici modifiée pour toutes les autres :
sed 'N;s/\n\* / --\n/;P;D' nono

Au final, le motif ressemble à celui de jipicy.
0