1. #1
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut [FAQ] Propositions pour la FAQ Linux sur sed

    Bonjour,

    Pour compléter la FAQ Linux section 6..3 sur sed que l'on a récemment ajoutée, voici deux propositions supplémentaires.

    Comment ajouter du texte ?
    a ajoute du texte après la ligne indiquée, i l'ajoute avant.
    Ajoute une ligne avec un texte après la ligne 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '2 a# Ceci est une ligne de commentaire'
    Ajoute une ligne avec un texte avant la ligne 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '2 i# Ceci est une ligne de commentaire'
    Ajoute une ligne avec un texte après chaque ligne ne commençant pas par #
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/^#/! a# Ceci est une ligne de commentaire'

    Comment afficher les lignes comprises entre une ligne commençant par un mot et une autre se terminant par un autre mot ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n -e '/^mot1/,/mot2$/p' nom_fichier
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  2. #2
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    2 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 2 874
    Points : 6 752
    Points
    6 752

    Par défaut

    Bonjour

    Tout dépend de ce que veut dire "FAQ".
    Si FAQ veut dire Foire Aux Questions, alors on peut rajouter ces questions.
    Si FAQ veut dire Frequently Asked Questions, alors on doit reconnaître que ces commandes, quoique vraies, ne sont JAMAIS sollicitées par ceux qui viennent poser des questions sur le forum.

    Dans le même ordre d'idée, il y a les commandes utilisant un fichier externe. Jamais utilisées non plus.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  3. #3
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    @Flodelarab
    Ton questionnement est légitime, et je n'ai pas la réponse !

    Je tiens toutefois à préciser que j'ai proposé l'ajout de ces deux points en lien avec des interventions sur le forum. Les intitulés n'étaient pas explicitement formulés en ces termes, mais dans le contenu des discussions de telles commandes étaient proposées à un moment ou un autre.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    23 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 23 042
    Points : 164 042
    Points
    164 042
    Billets dans le blog
    21

    Par défaut

    Du coup, je verrai bien l'ajout de :
    "Comment afficher des lignes spécifiques d'un fichier ?"

    Genre, affichage de la ligne 3 et 5.

    Sinon, je pense qu'il faut les intégrer. Des les deux cas de "FAQ", il faut intégrer. Lorsque je ne trouve pas un résultat dans une FAQ? bah je regarde le prochain résultat de Google (ou le premier).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par LittleWhite Voir le message
    Du coup, je verrai bien l'ajout de :
    "Comment afficher des lignes spécifiques d'un fichier ?"

    Genre, affichage de la ligne 3 et 5.
    Proposition concrète:

    Comment afficher des lignes spécifiques d'un fichier ?
    Il y a peut-être d'autres solutions !
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 412
    Points : 18 835
    Points
    18 835

    Par défaut

    Sinon, je pense qu'il faut les intégrer.
    en cours.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    2 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 2 874
    Points : 6 752
    Points
    6 752

    Par défaut

    La discussion s'appelle "Propositions pour la FAQ Linux sur sed". Puis-je émettre des idées sans rapport avec ce qui précède ?

    • Dans la faq, on peut lire:
      Nous pouvons combiner adressage par N° de ligne et par motif
      Efface la ligne 7 si elle commence par #
      Code bash : Sélectionner tout

      sed '/^#/,7 d'
      Ça, c'est faux. Il efface de la ligne qui commence par un croisillon jusqu'à la ligne 7. Pour que les conditions se combinent, il faut que la première ligne ayant un dièse soit la septième.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      $ cat testsed
      kjdfgkdfj
      #kdfjngd;f
      fd*
      dgdgdf
      #aqwaqw
      xzb
      ligne 7
      oinyjn
      njynyj
      ,unjujy
      yuiyuj
      # tata
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      $ sed '/^#/,7 d' testsed
      kjdfgkdfj
      oinyjn
      njynyj
      ,unjujy
      yuiyuj
      Supprimons les croisillons dans "testsed", et testons:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      $ sed '/^#/,7 d' testsed                                                                                                                                                                                                                     
      kjdfgkdfj
      kdfjngd;f
      fd*
      dgdgdf
      aqwaqw
      xzb
      ligne 7
      oinyjn
      njynyj
      ,unjujy
      yuiyuj
      Aucun changement n'est fait.

      Mettons un croisillon sur la ligne 7:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      $ sed '/^#/,7 d' testsed
      kjdfgkdfj
      kdfjngd;f
      fd*
      dgdgdf
      aqwaqw
      xzb
      oinyjn
      njynyj
      ,unjujy
      yuiyuj
      La ligne 7 a bien disparu.

      .
    • Proposition:
      Comment réutiliser une expression déjà trouvée ?
      En utilisant les références arrières: \1, \2, ..., \9 font référence au 1er, 2eme, ...., 9ème groupes de parenthèses rencontrées.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ sed 's/\(....\)\.\(..\)\.\(..\)/\3.\2.\1/' <<<"2018.01.11"                                                                                                                                                                                 
      11.01.2018
      Les parenthèses sont échappées pour ne pas être comprises comme caractères.
      Le point est échappé pour être compris comme caractère.

      NOTE 1: On peut utiliser les référence arrière dès la recherche:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ sed 's/\(bla\)\1\1/palabre/' <<<"Tes paroles sont des blablablas."                                                                                                                                                                         
      Tes paroles sont des palabres.
      NOTE 2: Pour réutiliser ce qui a été trouvé en entier, on peut aussi utiliser l'esperluette &
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ sed 's/tout/du & au &/' <<<"Sed, ça change tout."
      Sed, ça change du tout au tout.
    • En fait, pour les autres propositions, il faudrait reprendre tout ce qu'on a dit à gadj0dil0 dans sa discussion. L'utilisation des mémoires tampons, "comment supprimer un retour à la ligne ?", etc.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 412
    Points : 18 835
    Points
    18 835

    Par défaut

    La discussion s'appelle "Propositions pour la FAQ Linux sur sed". Puis-je émettre des idées sans rapport avec ce qui précède ?
    Bien sûr.

    La solution correcte est :
    c'est ça ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    Merci pour ton correctif Flodelarab.

    La solution correcte est :

    c'est ça ?
    Non, ça c'est la même chose.


    En fait, pour les autres propositions, il faudrait reprendre tout ce qu'on a dit à gadj0dil0 dans sa discussion. L'utilisation des mémoires tampons, "comment supprimer un retour à la ligne ?", etc.
    Tu proposes de faire de nouvelles entrées de FAQ pour sed sur ces points, ou de reprendre certaines entrées existantes pour les intégrer ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  10. #10
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 651
    Points : 7 377
    Points
    7 377

    Par défaut

    Citation Envoyé par chrtophe Voir le message
    Bien sûr.

    La solution correcte est :
    c'est ça ?
    Non, la solution est "plus complexe":
    En gnu sed, le ';' avant la fermeture du bloc n'est pas obligatoire, mais vaut mieux garder l'habitude de le mettre pour une meilleur compatibilité avec les autres version de sed.

    Ici, le bloc {...;} ne s'exécute que pour la ligne 7.

    De manière générale les commandes sed sur une suite d'adressage qui peuvent être:
    m,n: de la ligne m à la ligne n ou jusqu'à la dernière ligne si n est supérieur à celle-ci
    /r1/,/r2/: de la ligne avec la regex r1 à la ligne avec la regex r2 ou jusqu'à la dernière ligne si on ne trouve pas r2 avant. r1 doit toujours être trouvé avant r2 et rien n'empêche que les 2 regex soient sur la même ligne tant que l'ordre est respecté.

    Après sous gnu, on peut mixer les numéros de ligne et les regex:
    m,/r1/: de la ligne m à la ligne avec la regex r1
    /r1/,m: de la ligne avec la regex r1 à la ligne m

    On a aussi le cas suivant:
    n~p: à partir de la ligne n (comprise) et sur un pas de p jusqu'a la fin du fichier.
    Exemple:
    6~2:ne traiter que les lignes pair à partir de la ligne 6 (celle-ci comprise).
    Cordialement.

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 412
    Points : 18 835
    Points
    18 835

    Par défaut

    Que met on dans la faq donc ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  12. #12
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par chrtophe Voir le message
    Que met on dans la faq donc ?
    Je pense qu'on peut réintégrer la question qui a été supprimé suite à la remarque de Flodelarab en intégrant le correctif de disedorgue

    Comment supprimer des lignes précises à condition qu'elles contiennent un motif ?
    Efface la ligne 7 si elle commence par #
    (on pourrait éventuellement compléter par)
    Efface les lignes qui commencent par # depuis la ligne 4 jusqu'à la ligne 7

    On peut ajouter une entrée suite à la proposition de Littlewhite

    Comment afficher des lignes spécifiques d'un fichier ?
    Affiche les lignes 3 et 5 uniquement
    Attendons plus de précisions de Flodelarab concernant l'utilisation des mémoires tampons, "comment supprimer un retour à la ligne ?", etc.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  13. #13
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    2 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 2 874
    Points : 6 752
    Points
    6 752

    Par défaut

    • Références arrières: cf message précédent.
    • Comment ne pas traiter tout le fichier ?
      La dernière ligne traitée et affichée sera la 226ème.
    • Comment connaître le nombre de lignes d'un fichier ?
      Pourquoi le résultat est parfois différent de la commande wc -l ?
      Car sed compte chaque ligne commencée alors que wc compte les caractères de fin de ligne ("\n"). Si la dernière ligne d'un fichier texte n'est pas finie par un "\n", sed et wc ne donne pas le même nombre.
    • Pourquoi sed ne remplace-t-il aucun de mes retours à la ligne ?
      Car sed travaille ligne par ligne. Le caractère de fin de ligne "\n" n'est pas dans l'espace de travail de sed. Il ne peut donc pas le remplacer. On peut artificiellement faire apparaître ce caractère "\n" par les commandes N, G, H, par exemples.
      NOTE:
      Windows a des fins de ligne en CRLF (carriage return, line feed), \r\n, 0d0a
      Linux a des fins de ligne en LF, \n, 0a
      MacOS a des fins de ligne CR \r, 0d
    • Comment supprimer les "\r" en fin de ligne dans tout le fichier ?
    • Comment afficher un texte à l'envers ?
      On utilise ici l'espace mémoire. sed a 2 espaces: un espace de travail et un espace de mémoire pour stocker temporairement du texte. On utilise les commandes suivantes :
      h et H pour hold/mise en mémoire (avec ou sans écrasement).
      g et G pour get/rapatriement de la mémoire (avec ou sans écrasement).
      x pour exchange/échange des mémoires.
    • Comment supprimer toutes les fins de ligne "\n" du fichier ?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sed -n 'H;${g;s/\n//g;p}'
      ou alors
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sed ':z;N;$!b z;s/\n//g'
      Dans ce second cas, la commande b est un saut inconditionnel à l'étiquette z définie par ":z".
    • Comment mettre les lignes contenant un motif à la fin du fichier ?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sed '/motif/{1h;1!H;d};$G'
    • Comment remplacer du texte tant que c'est possible ?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ sed ':e;s@<div></div>@@;t e' <<<"<body><div><div><div><div><div></div></div></div></div></div></body>"
      <body></body>
      Ici, le saut à l'étiquette e est conditionnel. Le saut s'effectue si la substitution a réussi.


    A faire: Question pour le drapeau "M" dans la substitution, question pour la commande w (pas sûr que ce soit intéressant).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  14. #14
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    Pour la suppression des sauts de ligne, en faisant quelques recherches, j'ai trouvé cette autre solution, proche de la seconde solution proposée, mais un peu plus simple:
    bs assurant le branchement à l'étiquette :s
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  15. #15
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    juin 2007
    Messages
    2 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 2 684
    Points : 7 826
    Points
    7 826

    Par défaut

    Citation Envoyé par Flodelarab Voir le message
    NOTE:
    Windows a des fins de ligne en CRLF (carriage return, line feed), \r\n, 0d0a
    Linux a des fins de ligne en LF, \n, 0a
    MacOS a des fins de ligne CR \r, 0d
    C'est ce que je croyais aussi mais j'ai appris il y a peu que depuis 1999 (!), MacOS utilise aussi LF.

    Après réflexion, c'est assez logique vu l'utilisation d'une couche BSD et la certification POSIX qui impose LF.

    Je suggère donc de remplacer la note par:

    NOTE:
    Windows a des fins de ligne en CRLF (carriage return, line feed), \r\n, 0d0a
    Unix, Linux et Mac OS ont des fins de ligne en LF, \n, 0a (standard POSIX)
    ɹǝsn *sıɹɐlos*

  16. #16
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 651
    Points : 7 377
    Points
    7 377

    Par défaut

    Citation Envoyé par Philippe Dpt35 Voir le message
    Pour la suppression des sauts de ligne, en faisant quelques recherches, j'ai trouvé cette autre solution, proche de la seconde solution proposée, mais un peu plus simple:
    bs assurant le branchement à l'étiquette :s
    Ici, tu es sur le cas particulier du traitement de '\n', car en fait, tu ne traites pas la dernière ligne.
    Quand on utilise la commande N, il est fortement conseiller de vérifier avant si on n'a pas déjà atteint la dernière ligne.

    D'ailleurs, celle de Flodelarab a le même souci pour le cas où le fichier n'a qu'une seule ligne.

    Mais bon, on traite le cas du suppression de ligne, donc ça passe pour les 2 solutions.
    Après, à vous de voir si on se veut plus général qui serait plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;$!{N;b z;};s/\n//g'
    Cordialement.

  17. #17
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    2 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 2 874
    Points : 6 752
    Points
    6 752

    Par défaut

    Citation Envoyé par jlliagre Voir le message
    C'est ce que je croyais aussi mais j'ai appris il y a peu que depuis 1999 (!), MacOS utilise aussi LF.

    Après réflexion, c'est assez logique vu l'utilisation d'une couche BSD et la certification POSIX qui impose LF.

    Je suggère donc de remplacer la note par:

    NOTE:
    Windows a des fins de ligne en CRLF (carriage return, line feed), \r\n, 0d0a
    Unix, Linux et Mac OS ont des fins de ligne en LF, \n, 0a (standard POSIX)
    Sauf que dans le concret, on voit encore des internautes débarquer avec des fichiers textes ayant des lignes finies par "\r".
    Je propose donc de faire une indication mixte pour Mac OS

    La différence viendrait-elle de la différence entre Mac OS et Mac OSX ?

    Pour la suppression des sauts de ligne, en faisant quelques recherches, j'ai trouvé cette autre solution, proche de la seconde solution proposée, mais un peu plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    bs assurant le branchement à l'étiquette :s
    Autant "ts" j'aurais compris. Mais "bs" ! Je ne comprends même pas pourquoi il s'arrête puisque le saut est inconditionnel.
    J'ai appris un truc : N=q si N est impossible.
    Une erreur fatale serait, pour éviter la dernière ligne, d'écrire:
    Car sed tournerait en rond dans une boucle infinie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;$!{N;b z;};s/\n//g'
    Je suis d'accord avec cette solution.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  18. #18
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    novembre 2015
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité

    Informations forums :
    Inscription : novembre 2015
    Messages : 604
    Points : 2 629
    Points
    2 629
    Billets dans le blog
    1

    Par défaut

    Petite question personnelle à propos de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;$!{N;b z;};s/\n//g'
    Si je comprends bien la commande, ça place une étiquette sur la ligne en cours(:z), puis (sauf pour la dernière ligne $!) ajoute la ligne suivante à l'espace de travail (N), retourne à la ligne en cours (b z) à laquelle s'est ajoutée la ligne suivante, et supprime le caractère de fin de ligne (s/\n//g)

    Mais alors ensuite sed ne passe pas à la ligne suivante, et tient compte de la ligne ajoutée à l'espace de travail pour la sauter ? Car sinon les lignes s'afficheraient 2 fois ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et la Raspberry pi en cliquant sur ce lien.

  19. #19
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 651
    Points : 7 377
    Points
    7 377

    Par défaut

    Une version gnu qui supprime tout les '\n' en une seule fois et même celui de la dernière ligne:
    Si on ne veut pas supprimer le tout dernier (celui de la dernière ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -z 's/\n\(.\)/\1/g'
    Ici, sed ne prend plus comme séparateur de ligne le '\n' mais le caractère NUL (\000) , et donc dans un fichier texte standard ou NUL n'apparait pas, sed ne vois qu'une seule ligne:
    Sans l'option -z:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo -e '#bon\n#pasbon\n#bon' | sed '='
    1
    #bon
    2
    #pasbon
    3
    #bon
    Avec l'option -z:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo -e '#bon\n#pasbon\n#bon' | sed -z '='
    1#bon
    #pasbon
    #bon
    Citation Envoyé par Philippe Dpt35 Voir le message
    Petite question personnelle à propos de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;$!{N;b z;};s/\n//g'
    Si je comprends bien la commande, ça place une étiquette sur la ligne en cours(:z), puis (sauf pour la dernière ligne $!) ajoute la ligne suivante à l'espace de travail (N), retourne à la ligne en cours (b z) à laquelle s'est ajoutée la ligne suivante, et supprime le caractère de fin de ligne (s/\n//g)

    Mais alors ensuite sed ne passe pas à la ligne suivante, et tient compte de la ligne ajoutée à l'espace de travail pour la sauter ? Car sinon les lignes s'afficheraient 2 fois ?
    La commande N, charge juste la ligne suivante ou force la fin de cycle si on était déjà à la dernière ligne du fichier. l'affichage de l'espace de travail par sed (donc sans l'option -n), ne se fait qu'à la fin de chaque cycle.
    Cordialement.

  20. #20
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    2 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 2 874
    Points : 6 752
    Points
    6 752

    Par défaut

    Si je comprends bien la commande, ça place une étiquette sur la ligne en cours(:z),
    C'est une étiquette dans le programme. Pas une étiquette dans le texte.
    Mais alors ensuite sed ne passe pas à la ligne suivante, et tient compte de la ligne ajoutée à l'espace de travail pour la sauter ? Car sinon les lignes s'afficheraient 2 fois ?
    Oui il saute. Non il ne l'affiche pas 2 fois.
    Une version gnu qui supprime tout les '\n' en une seule fois et même celui de la dernière ligne:
    Si la norme dit qu'une ligne valide se termine par \n, ce n'est pas conseillé d'enlever le dernier. Mais l'option "-z" est intéressante. Elle évite la boucle .

    En même temps, la FAQ doit donner des idées de ce qui est possible. Les utilisateurs composent.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/11/2016, 15h44
  2. Vos propositions pour la FAQ Word
    Par Heureux-oli dans le forum Contribuez
    Réponses: 1
    Dernier message: 26/05/2009, 15h46
  3. comment faire une proposition pour la faq
    Par ddrmax dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/07/2008, 09h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo