Rechercher : dans
Par :

Sed : ligne précédant celle identifié

Dernière réponse le 16 mar 2009 à 10:24:49 nono58, le 13 mar 2009 à 17:14:52 
 Signaler ce message aux modérateurs

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...

Meilleures réponses pour « sed : ligne précédant celle identifié » dans :
Sed - Introduction à SED - Part III Voir SED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Sed - Introduction à SED - Part I VoirSED - The Stream EDitor - Part I Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED" un...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Sed - Numérotation de lignes VoirNumérotation * Numéroter les lignes (équivalent à "cat -n fichier.txt") sed = fichier.txt L'inconvénient c'est que l'affichage se fait sur 2 lignes. Donc pour palier à ce petit "défaut" sed = fichier.txt | sed 'N;s/\n/\t/' Numéroter les...
Tableur - Les cellules VoirLa notion de cellule On appelle "cellule" l'intersection entre une ligne (horizontale) et une colonne (verticale) de la feuille de calcul. Ainsi le nom de la ligne combiné au nom de la colonne donne les coordonnées d'une cellule (le terme d'adresse...
Tableur - La sélection des cellules VoirSélection de cellules Le tableur est un formidable outil pour manipuler des données. Ainsi, pour pouvoir manipuler les données il est nécessaire de disposer d'outils permettant de sélectionner rapidement toutes les cellules dont on a...

1

fiddy, le 13 mar 2009 à 17:46:19

Salut
Tu peux utiliser

sed 'N; s/--\n/\n* /g' fichier

Cdlt
Google is your friend

Répondre à fiddy

3

fiddy, le 13 mar 2009 à 21:14:57

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

Google is your friend

Répondre à fiddy

2

jipicy, le 13 mar 2009 à 20:50:43

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]$
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

4

nono58, le 16 mar 2009 à 09:10:19

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 ???

Répondre à nono58

5

jipicy, le 16 mar 2009 à 09:12:30

Re-

Voir dans la FAQ : SED - Les commandes avancées
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

6

jipicy, le 16 mar 2009 à 09:26:22

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

' $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

8

nono-58, le 16 mar 2009 à 10:19:58

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.

Répondre à nono-58

7

nono58, le 16 mar 2009 à 09:59:56

Autant pour moi, il y a de très bonnes explications dans les astuces du site :o)

Répondre à nono58

9

 fiddy, le 16 mar 2009 à 10:24:49

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.
Google is your friend

Répondre à fiddy
Collection CommentÇaMarche.net