• sed ignorer une occurence

    From benoit@21:1/5 to All on Thu Jun 1 12:50:01 2023
    This is a multi-part message in MIME format.

    Qm9uam91cgoKSmUgdm91ZHJhaXMgcmVmb3JtYXRlciBkdSB0ZXh0ZSBlbiBjb2xvbm5lLCBxdWkg YSDDqXTDqSBqdXN0aWZpw6kgYXZlYyBkZXMgcmV0b3VycyDDoCBsYSBsaWduZSAoXG4pIGV0IGRl cyAiLSIgZGUgY291cHVyZSBkZSBtb3QKZXg6CkplIHZvdWRyYWlzIHJlZm9ybWF0ZXIgZHUgdGV4 dGUgZW4gY29sb25uZSwgcXVpIGEgw6l0w6kganVzdC0gwqstLS0KaWZpw6kgYXZlYyBkZXMgcmV0 b3VycyDDoCBsYSBsaWduZSAoXG4pIGV0IGVzdCAtIGRlIGNvdXB1cmUgZGUKbW90LgoKJSBzZWQg LXJ6ICd7cy8tXG4vL2c7cy9cbi8vZ30nIGZvcm1hdC50eHQKCk1haXMgamUgbmUgc3VpcyBwYXMg c2F0aXNmYWl0IGR1IHLDqXN1bHRhdCBwYXJjZSBxdWUgamUgdm91ZHJhaXMgaWdub3JlciBsZXMg cG9pbnRzICguXG4pIHN1aXZpdCBkJ3VuIHJldG91ciDDoCBsYSBsaWduZS4KCk1lcmNpIGQnYXZh bmNlCgotLQpCZW5vw650CgpFbnZvecOpIGF2ZWMgbGEgbWVzc2FnZXJpZSBzw6ljdXJpc8OpZSBb UHJvdG9uIE1haWwuXShodHRwczovL3Byb3Rvbi5tZS8p

    PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0 cHg7Ij48c3Bhbj5Cb25qb3VyIDwvc3Bhbj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48 ZGl2PkplIHZvdWRyYWlzIHJlZm9ybWF0ZXIgZHUgdGV4dGUgZW4gY29sb25uZSwgcXVpIGEgw6l0 w6kganVzdGlmacOpIGF2ZWMgZGVzIHJldG91cnMgw6AgbGEmbmJzcDsgbGlnbmUgKFxuKSBldCBk ZXMgIi0iIGRlIGNvdXB1cmUgZGUgbW90PC9kaXY+PGRpdj5leDo8L2Rpdj48ZGl2PjxzcGFuPkpl IHZvdWRyYWlzIHJlZm9ybWF0ZXIgZHUgdGV4dGUgZW4gY29sb25uZSwgcXVpIGEgw6l0w6kganVz dC0gwqstLS08YnI+PC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+aWZpw6kgYXZlYyBkZXMgcmV0b3Vy cyDDoCBsYSZuYnNwOyBsaWduZSAoXG4pIGV0IGVzdCAtIGRlIGNvdXB1cmUgZGU8L3NwYW4+PC9k aXY+PGRpdj48c3Bhbj4mbmJzcDttb3QuPC9zcGFuPjwvZGl2PjxkaXY+PHNwYW4+PGJyPjwvc3Bh bj48L2Rpdj48ZGl2PjxzcGFuPiUgPHNwYW4+c2VkIC1yeiAne3MvLVxuLy9nO3MvXG4vL2d9JyBm b3JtYXQudHh0PC9zcGFuPjxicj48L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj48YnI+PC9zcGFuPjwv ZGl2PjxkaXY+PHNwYW4+TWFpcyBqZSBuZSBzdWlzIHBhcyBzYXRpc2ZhaXQgZHUgcsOpc3VsdGF0 IHBhcmNlIHF1ZSBqZSB2b3VkcmFpcyBpZ25vcmVyIGxlcyBwb2ludHMgKC5cbikgc3Vpdml0IGQn dW4gcmV0b3VyIMOgIGxhIGxpZ25lLjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPjxicj48L3NwYW4+ PC9kaXY+PGRpdj48c3Bhbj5NZXJjaSBkJ2F2YW5jZTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPjxi cj48L3NwYW4+PC9kaXY+PGRpdj48c3Bhbj4tLTwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPkJlbm/D rnQgPGJyPjwvc3Bhbj48L2Rpdj48ZGl2PjxzcGFuPjxicj48L3NwYW4+PGRpdj48L2Rpdj48L2Rp dj48YnI+PC9kaXY+PGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBm b250LXNpemU6IDE0cHg7Ij48YnI+PC9kaXY+DQo8ZGl2IGNsYXNzPSJwcm90b25tYWlsX3NpZ25h dHVyZV9ibG9jayIgc3R5bGU9ImZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC1z aXplOiAxNHB4OyI+DQogICAgPGRpdiBjbGFzcz0icHJvdG9ubWFpbF9zaWduYXR1cmVfYmxvY2st dXNlciBwcm90b25tYWlsX3NpZ25hdHVyZV9ibG9jay1lbXB0eSI+DQogICAgICAgIA0KICAgICAg ICAgICAgPC9kaXY+DQogICAgDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm90b25tYWlsX3Np Z25hdHVyZV9ibG9jay1wcm90b24iPg0KICAgICAgICBFbnZvecOpIGF2ZWMgbGEgbWVzc2FnZXJp ZSBzw6ljdXJpc8OpZSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly9wcm90b24ubWUv IiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPlByb3RvbiBNYWlsLjwvYT4NCiAgICA8L2Rpdj4N CjwvZGl2Pg0K

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Basile Starynkevitch@21:1/5 to benoit on Thu Jun 1 13:00:01 2023
    This is a multi-part message in MIME format.
    On 6/1/23 12:46, benoit wrote:
    Bonjour


    Je voudrais reformater du texte en colonne, qui a été justifié avec
    des retours à la  ligne (\n) et des "-" de coupure de mot
    ex:
    Je voudrais reformater du texte en colonne, qui a été just- «---
    ifié avec des retours à la  ligne (\n) et est - de coupure de
     mot.

    % sed -rz '{s/-\n//g;s/\n//g}' format.txt

    Mais je ne suis pas satisfait du résultat parce que je voudrais
    ignorer les points (.\n) suivit d'un retour à la ligne.

    Merci d'avance



    Une possibilité est l'utilisation de l'utilitaire https://man7.org/linux/man-pages/man1/fmt.1.html


    Une autre possibilité est de le faire sous GNU emacs https://www.gnu.org/software/emacs/

    (ave un peu d'huile de coude, c'est automatisable)


    Une autre possibilité est de coder avec GNU bison et/ou GNU flex.

    La difficulté est de définir ce qu'est un mot (on peut imaginer un texte encodé en UTF-8 avec un mélange de mots en hébreu -ou chinois ou serbe
    ou arabe ou simplement en anglais- et en français, et alors le problème
    est bien plus difficile).


    Il faut formaliser ce qu'est le texte d'entrée, et le jeu de caractères utilisé (UTF-8) et le language humain utilisé.


    Même pour du texte en français (ou en anglais), les règles de césure
    sont complexes, je ne ne les connais pas toutes (la consultation d'une grammaire ou d'un manuel typographique s'impose). Par exemple, je crois
    me souvenir qu'un nombre (en français) comme 2 145 906 (la population de Paris en 2020) ne doit pas être césuré!


    Les logiciels de typographie libres (par exemple https://latex.org/ ou
    Lout en https://ftp.gnu.org/gnu/lout.README ...) sont compliqué pour
    gérer la césure correctement!

    Librement


    --
    Basile Starynkevitch<basile@starynkevitch.net>
    (only mine opinions / les opinions sont miennes uniquement)
    92340 Bourg-la-Reine, France
    web page: starynkevitch.net/Basile/

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 6/1/23 12:46, benoit wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:Cy-FhBvuBH3K5Uh3Uuil4aIEyMTVf-3NsGJ5TirLE9nq7WDUGm_5grVSqxu2lvNjLtI7_VzJjDVUqk6f8c3_PfMh0ssIAo9wYZPzQ28djus=@protonmail.ch">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <div style="font-family: Arial, sans-serif; font-size: 14px;"><span>Bonjour
    </span>
    <div><br>
    </div>
    <div><br>
    </div>
    <div>Je voudrais reformater du texte en colonne, qui a été
    justifié avec des retours à la  ligne (\n) et des "-" de
    coupure de mot</div>
    <div>ex:</div>
    <div><span>Je voudrais reformater du texte en colonne, qui a été
    just- «---<br>
    </span></div>
    <div><span>ifié avec des retours à la  ligne (\n) et est - de
    coupure de</span></div>
    <div><span> mot.</span></div>
    <div><span><br>
    </span></div>
    <div><span>% <span>sed -rz '{s/-\n//g;s/\n//g}' format.txt</span><br>
    </span></div>
    <div><span><br>
    </span></div>
    <div><span>Mais je ne suis pas satisfait du résultat parce que
    je voudrais ignorer les points (.\n) suivit d'un retour à la
    ligne.</span></div>
    <div><span><br>
    </span></div>
    <div><span>Merci d'avance</span></div>
    <br>
    </div>
    </blockquote>
    <p><br>
    </p>
    <p><br>
    </p>
    <p>Une possibilité est l'utilisation de l'utilitaire
    <a class="moz-txt-link-freetext" href="https://man7.org/linux/man-pages/man1/fmt.1.html">https://man7.org/linux/man-pages/man1/fmt.1.html</a></p>
    <p><br>
    </p>
    <p>Une autre possibilité est de le faire sous GNU emacs
    <a class="moz-txt-link-freetext" href="https://www.gnu.org/software/emacs/">https://www.gnu.org/software/emacs/</a></p>
    <p>(ave un peu d'huile de coude, c'est automatisable)</p>
    <p><br>
    </p>
    <p>Une autre possibilité est de coder avec GNU bison et/ou GNU flex.</p>
    <p>La difficulté est de définir ce qu'est un mot (on peut imaginer
    un texte encodé en UTF-8 avec un mélange de mots en hébreu -ou
    chinois ou serbe ou arabe ou simplement en anglais- et en
    français, et alors le problème est bien plus difficile).</p>
    <p><br>
    </p>
    <p>Il faut formaliser ce qu'est le texte d'entrée, et le jeu de
    caractères utilisé (UTF-8) et le language humain utilisé.</p>
    <p><br>
    </p>
    <p>Même pour du texte en français (ou en anglais), les règles de
    césure sont complexes, je ne ne les connais pas toutes (la
    consultation d'une grammaire ou d'un manuel typographique
    s'impose). Par exemple, je crois me souvenir qu'un nombre (en
    français) comme 2 145 906 (la population de Paris en 2020) ne doit
    pas être césuré!<br>
    </p>
    <p><br>
    </p>
    <p>Les logiciels de typographie libres (par exemple
    <a class="moz-txt-link-freetext" href="https://latex.org/">https://latex.org/</a> ou Lout en <a class="moz-txt-link-freetext" href="https://ftp.gnu.org/gnu/lout.README">https://ftp.gnu.org/gnu/lout.README</a>
    ...) sont compliqué pour gérer la césure correctement!<br>
    </p>
    <p>Librement<br>
    </p>
    <p><br>
    </p>
    <pre class="moz-signature" cols="72">--
    Basile Starynkevitch <a class="moz-txt-link-rfc2396E" href="mailto:basile@starynkevitch.net">&lt;basile@starynkevitch.net&gt;</a>
    (only mine opinions / les opinions sont miennes uniquement)
    92340 Bourg-la-Reine, France
    web page: starynkevitch.net/Basile/

    </pre>
    </body>
    </html>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Thu Jun 1 16:10:01 2023
    Le 1 juin 2023 benoit a écrit :

    Il me reste juste l'exception pour le cas ou je veux laisser les "\n" des lignes qui se terminent par un "." ?

    Ah oui j'avais zappé ça. Voilà mon texte de test :

    Je voudrais reformater du texte en colonne, qui a été just-
    ifié avec des retours à la ligne (\n) et est - de coupure de
    mot.
    Mais pas ce dernier.

    Et l'ajout de la ligne qui va bien :

    (defun ConvertRet ()
    "Convertit un retour à la ligne."
    (interactive)
    (let (
    (p1 (region-beginning))
    (p2 (region-end)))
    (save-restriction
    (narrow-to-region p1 p2)
    (goto-char (point-min))
    (while (re-search-forward "-\\\n" nil t)
    (replace-match "" nil t))
    (goto-char (point-min))
    (while (re-search-forward "\\\n" nil t)
    (cond (not match ".\\\n")
    (replace-match " " nil t)))
    )))

    (defun indentBuffer ()
    "Convertit un texte jutifié avec des retours à la ligne."
    (interactive)
    (mark-whole-buffer)
    (ConvertRet))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Thu Jun 1 15:30:01 2023
    Le 1 juin 2023 benoit a écrit :

    Je m'y suis essayé, j'ai abandonné, mais avec un petit coupe de pouce... ;-)

    Tu y étais presque :)

    (defun ConvertRet ()
    "Convertit un retour à la ligne."
    (interactive)
    (let (
    (p1 (region-beginning))
    (p2 (region-end)))
    (save-restriction
    (narrow-to-region p1 p2)
    (goto-char (point-min))
    (while (re-search-forward "-\\\n" nil t)
    (replace-match "" nil t))
    (goto-char (point-min))

    (while (re-search-forward "\\\n" nil t)
    (replace-match " " nil t))
    )))

    (defun indentBuffer ()
    "Convertit un texte jutifié avec des retours à la ligne."
    (interactive)
    (mark-whole-buffer)
    (ConvertRet))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Thu Jun 1 21:00:01 2023
    Le 1 juin 2023 benoit a écrit :

    Ne fonctionne pas chez moi

    Autant pour moi, faut toujours regarder les Messages :)
    Là ça devrait marcher pour de vrai.

    (defun ConvertRet ()
    "Convertit un retour à la ligne."
    (interactive)
    (let (
    (p1 (region-beginning))
    (p2 (region-end)))
    (save-restriction
    (narrow-to-region p1 p2)
    (goto-char (point-min))
    (while (re-search-forward "-\\\n" nil t)
    (replace-match "" nil t))
    (goto-char (point-min))
    (while (re-search-forward "\\([^.]\\)\\\n" nil t)
    (replace-match (concat (match-string 1) " ") nil t))
    )))

    (defun indentBuffer ()
    "Convertit un texte jutifié avec des retours à la ligne."
    (interactive)
    (mark-whole-buffer)
    (ConvertRet))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Thu Jun 1 21:30:01 2023
    Le 1 juin 2023 benoit a écrit :

    A certains endroits ça mets deux espaces, je vais chercher pourquoi...
    Mais en attendant de comprendre, je retourne au début et repasse une fois pour les virer et c'est bon ! ;-)

    tu dois avoir des espaces en fin de ligne qui trainent, donc peut-être,
    pour ne pas supprimer des double espaces qui seraient valides :

    (defun ConvertRet ()
    "Convertit un retour à la ligne."
    (interactive)
    (let (
    (p1 (region-beginning))
    (p2 (region-end)))
    (save-restriction
    (narrow-to-region p1 p2)
    (goto-char (point-min))
    (while (re-search-forward "-\\\n" nil t)
    (replace-match "" nil t))
    (goto-char (point-min))
    (while (re-search-forward " \\\n" nil t)
    (replace-match " " nil t))
    (goto-char (point-min))
    (while (re-search-forward "\\([^.]\\)\\\n" nil t)
    (replace-match (concat (match-string 1) " ") nil t))
    )))

    (defun indentBuffer ()
    "Convertit un texte jutifié avec des retours à la ligne."
    (interactive)
    (mark-whole-buffer)
    (ConvertRet))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From l0f4r0@tuta.io@21:1/5 to All on Fri Jun 2 09:00:01 2023
    Hello,

    1 juin 2023, 12:46 de benoitlst@protonmail.ch:

    % > sed -rz '{s/-\n//g;s/\n//g}' format.txt

    Mais je ne suis pas satisfait du résultat parce que je voudrais ignorer les points (.\n) suivit d'un retour à la ligne.

    sed ':a;N;$!ba;s/-\n//g' format.txt

    l0f4r0

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Chantreux@21:1/5 to All on Fri Jun 2 18:20:01 2023
    salut,

    Le Thu, Jun 01, 2023 at 10:46:00AM +0000, benoit a écrit :
    Je voudrais reformater du texte en colonne, qui a été justifié avec des retours
    à la ligne (\n) et des "-" de coupure de mot
    ex:
    Je voudrais reformater du texte en colonne, qui a été just- «---
    ifié avec des retours à la ligne (\n) et est - de coupure de
    mot.

    % sed -rz '{s/-\n//g;s/\n//g}' format.txt

    <<\% sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72

    Je suis pas sur d'avoir compris le pb.

    Je voudrais reformater du texte en colonne,
    qui a été just-
    ifié avec des retours à la ligne (\n) et
    est - de coupure de mot.

    %

    Si la commande correspond bien à ton besoin, tu peux directement
    l'utiliser dans vi grace à un range.

    si tu as fais une selection visuelle, tappes

    !sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72

    les prochains usages de ! rappellent le dernier filtre, tu n'auras
    plus qu'a taper !! au lieu de ! et rappeler la commande.

    Évidement ça marche avec tous les ranges :)

    astuce: mettre le filtre dans un fichier à part pour en faciliter la maintenance:

    :sp monfiltre
    :!chmod a+x %

    et ensuite tu peux écrire ton filtre en espaçant un peu et en commentant

    #!/bin/sh
    # note1: je ne vire le retour à la ligne que si il est précédé
    # d'autre chose qu'un espace
    sed -rz '
    s/-\n//g
    s/([^.\n])\n/\1/g # cf. note1
    ' |
    tr -s ' ' |
    fmt -w72

    et finalement

    filtrer avec <monrange>!./monfiltre

    je fais concis pour aller vite. n'hésite pas à me demander de plus
    amples explications si cette piste de plait.

    cordialement,
    marc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)