Sed : ligne précédant celle identifié
Résolu
nono58
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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...
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...
A voir également:
- Sed : ligne précédant celle identifié
- Remplacez le mot sed par le mot mais dans tout le texte. combien de caractères contient le document suite à cette modification (en incluant les espaces) ? - Guide
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Sed crlf - Astuces et Solutions
- Sed - Remplacement texte par retour à la ligne ? ✓ - Forum Linux / Unix
- Sed supprimer ligne vide - Forum Linux / Unix
4 réponses
Salut,
Au cas ou tu aurais aussi des lignes ne se continuant pas sur l'autre lignes :
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]$;-))
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 ???
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 ???
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
'
Ca serait donc plutôt :