• Re : Re: sed ignorer une occurence

    From benoit@21:1/5 to All on Thu Jun 1 15:40:01 2023
    Le jeudi 1 juin 2023 à 15:21, Michel Verdier <[email protected]> a écrit :

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

    Un tout grand merci ! :-)
    Il me reste juste l'exception pour le cas ou je veux laisser les "\n" des lignes qui se terminent par un "." ?

    C'est sur ce site que je me suis initié à faire mes macros pour emacs, du coup un petit UP dans les moteurs de recherche !
    http://xahlee.info/emacs/emacs


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From benoit@21:1/5 to All on Thu Jun 1 18:20:01 2023
    This is a multi-part message in MIME format.

    Le jeudi 1 juin 2023 à 16:01, Michel Verdier <[email protected]> a écrit :


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


    (cond (not match ".\\\n")
    Ne fonctionne pas chez moi

    Est ce que ".\\\n" ne veut pas dire n'importe que caractère (.) suivit de \n ?

    Du coup j'ai essayé deux formes :
    "\\.\\\n"
    "[.]\\\n"

    Mais il désélectionne la première ligne et rien ne se passe
    J'ai joint un fichier formaté sur 72 caractères comme exemple


    TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4g RG9uZWMgbW9sbGlzIApzYWdpdHRpcyBsaWJlcm8gYXQgc2VtcGVyLiBJbiBsYWNpbmlhIGluIGxv cmVtIHNpdCBhbWV0IHNlbXBlci4gTnVsbGEgCnBlbGxlbnRlc3F1ZSB2ZW5lbmF0aXMgZG9sb3Is IGV0IGRhcGlidXMgZG9sb3IgZmV1Z2lhdCB1dC4gQWVuZWFuIHB1cnVzIApudW5jLCBlbGVtZW50 dW0gdmVsIGxlY3R1cyBzZWQsIGJsYW5kaXQgbGFvcmVldCBpcHN1bS4gQWVuZWFuIGluIGF1Z3Vl IApsb2JvcnRpcyBsZW8gYWNjdW1zYW4gbWF4aW11cy4gTWFlY2VuYXMgYW50ZSBlc3QsIG9ybmFy ZSB2ZWwgCnVsbGFtY29ycGVyIHNvZGFsZXMsIHVsdHJpY2VzIHNpdCBhbWV0IGF1Z3VlLiBEb25l YyB1dCBhdWd1ZSBlZ2V0IG9kaW8gCnRlbXB1cyBjb25kaW1lbnR1bSBzaXQgYW1ldCBldSB0b3J0 b3IuCgpBbGlxdWFtIHRpbmNpZHVudCBsYWNpbmlhIG51bGxhIGV1IHByZXRpdW0uIE51bmMgZXUg dmVsaXQgdmVsaXQuIE1hdXJpcyAKYSB2b2x1dHBhdCBvZGlvLCB2aXRhZSBtb2xlc3RpZSB0ZWxs dXMuIFByb2luIGZlcm1lbnR1bSB0ZW1wdXMgdGVtcG9yLiAKTWFlY2VuYXMgcGVsbGVudGVzcXVl IGNvbnNlcXVhdCBxdWFtLCBpbiBmcmluZ2lsbGEgbGVjdHVzIG1vbGxpcyBuZWMuIApVdCB0cmlz dGlxdWUgbWFnbmEgaGVuZHJlcml0LCBncmF2aWRhIG1ldHVzIGlkLCBkYXBpYnVzIGR1aS4gUHJv aW4gc2VkIApjb25zZXF1YXQgcmlzdXMuIEFlbmVhbiBldSBwbGFjZXJhdCBsZW8uIFN1c3BlbmRp c3NlIHB1bHZpbmFyIGF1Z3VlIApwb3J0dGl0b3IgcmlzdXMgdGVtcHVzIHRyaXN0aXF1ZS4gRG9u ZWMgbWF1cmlzIG51bGxhLCBzdXNjaXBpdCBub24gYXJjdSAKbm9uLCB1bGxhbWNvcnBlciBmZXVn aWF0IGR1aS4gVmVzdGlidWx1bSBhdCBvcmNpIGN1cnN1cywgZWxlbWVudHVtIAp0ZWxsdXMgdXQs IGFjY3Vtc2FuIGlwc3VtLgoKTmFtIGx1Y3R1cyBuZXF1ZSBxdWlzIGFyY3UgcG9zdWVyZSwgdnVs cHV0YXRlIHZvbHV0cGF0IG1hZ25hIGVmZmljaXR1ci4gCk1hZWNlbmFzIHV0IGxlbyBxdWlzIGVz dCBtb2xlc3RpZSBmYXVjaWJ1cy4gTmFtIGNvbW1vZG8gZXN0IGFjIGVsaXQgCm1vbGVzdGllIGhl bmRyZXJpdC4gQWxpcXVhbSB1dCBhbGlxdWV0IG1hdXJpcy4gTWFlY2VuYXMgbWFnbmEgbWFnbmEs IAp2b2x1dHBhdCBjdXJzdXMgbGlndWxhIHZlbCwgdHJpc3RpcXVlIGxhb3JlZXQgYW50ZS4gTWFl Y2VuYXMgbWFsZXN1YWRhIAphbnRlIGZyaW5naWxsYSwgc2FnaXR0aXMgbWFzc2EgZnJpbmdpbGxh LCBydXRydW0gbGlndWxhLiBOdWxsYW0gZ3JhdmlkYSAKZG9sb3IgdXQgZG9sb3IgZmF1Y2lidXMs IGFjIHBvc3VlcmUgbWF1cmlzIGxvYm9ydGlzLiBGdXNjZSB0ZW1wb3IgCnNvZGFsZXMgZW5pbSwg ZXQgbG9ib3J0aXMgYXJjdSBtYXR0aXMgdmVoaWN1bGEuIFV0IHBvc3VlcmUgdHJpc3RpcXVlIApk aWFtIGlkIGxvYm9ydGlzLiBJbnRlZ2VyIHBvcnRhIG5lcXVlIHNpdCBhbWV0IGVyYXQgYWxpcXVl dCBjb25zZWN0ZXR1ciAKc2VkIHF1aXMgbWkuIE1hZWNlbmFzIHV0IG1heGltdXMgZGlhbS4gU2Vk IHJob25jdXMgbG9yZW0gdmVsIGVyb3MgCmRpY3R1bSwgc2l0IGFtZXQgdmVoaWN1bGEgZHVpIG1v bGxpcy4gTWF1cmlzIGV1aXNtb2QgZmVsaXMgaGVuZHJlcml0LCAKdGVtcHVzIHNhcGllbiBxdWlz LCBjb21tb2RvIGVyb3MuIFZlc3RpYnVsdW0gaWQgYXVjdG9yIGxpYmVybywgbm9uIAphY2N1bXNh biBlbmltLiBOdWxsYSBmYWNpbGlzaS4gTWF1cmlzIHZlbCBsYWNpbmlhIHNlbS4KCkFsaXF1YW0g bmVjIG1vbGVzdGllIGVuaW0uIENyYXMgYWMganVzdG8gZXJvcy4gVmVzdGlidWx1bSBhbnRlIGlw c3VtIApwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSBsdWN0dXMgZXQgdWx0cmljZXMgcG9zdWVyZSBj dWJpbGlhIGN1cmFlOyBGdXNjZSAKZWdldCBmZWxpcyBjb25ndWUsIHZ1bHB1dGF0ZSBlc3QgZWdl dCwgYmliZW5kdW0gc2FwaWVuLiBEb25lYyAKc2NlbGVyaXNxdWUgZXJhdCB2aXRhZSBtYXNzYSBt b2xlc3RpZSBzb2RhbGVzLiBVdCBsb3JlbSBxdWFtLCB2YXJpdXMgYWMgCnB1cnVzIGluLCBjdXJz dXMgcHVsdmluYXIgYW50ZS4gUGhhc2VsbHVzIGV0IG1pIHNlZCBlbGl0IG1vbGVzdGllIAphY2N1 bXNhbi4gVXQgdmVuZW5hdGlzIHN1c2NpcGl0IHVybmEgcXVpcyBjb21tb2RvLiBBbGlxdWFtIHN1 c2NpcGl0IAphbGlxdWV0IG1hZ25hLCB2aXRhZSBjb25kaW1lbnR1bSBpcHN1bSBhbGlxdWV0IGlu LiBQZWxsZW50ZXNxdWUgCmNvbmRpbWVudHVtIGVzdCBldSBsb3JlbSBlbGVtZW50dW0gbHVjdHVz LiBOdW5jIHZlbmVuYXRpcyBqdXN0byBzaXQgCmFtZXQgZHVpIHJ1dHJ1bSBzY2VsZXJpc3F1ZS4g RHVpcyB1dCBwZWxsZW50ZXNxdWUgYW50ZSwgb3JuYXJlIAp2dWxwdXRhdGUgZHVpLiBFdGlhbSBj b25ndWUgc2VkIGFudGUgc2l0IGFtZXQgZXVpc21vZC4gTWFlY2VuYXMgcnV0cnVtIApsYW9yZWV0 IHNhcGllbiB1dCB0aW5jaWR1bnQuIE1hZWNlbmFzIGNvbW1vZG8gZXJvcyBzaXQgYW1ldCBwb3N1 ZXJlIAp2YXJpdXMu

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From benoit@21:1/5 to All on Thu Jun 1 21:20:01 2023
    Le jeudi 1 juin 2023 à 20:54, Michel Verdier <[email protected]> a écrit :


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



    Un tout grand merci... :-)


    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 ! ;-)


    (defun ConvertRet ()
    "Convertit les retours à 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))
    (goto-char (point-min))
    (while (re-search-forward " " nil t)
    (replace-match " " nil t))

    )))


    Avec gratitude,

    --
    Benoît

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Dethegeek@21:1/5 to All on Sat Jun 3 14:10:01 2023
    Bonjour,

    J'ai fait un peu de révision sur les regex hier, justement.

    Les backreferences servent à exprimer un occurrence de texte identique à
    une autre occurence précédente, capturée par des parenthèses.

    Par exemple, dans un texte contenant des chaînes délimitées soit par des doubles quotes ou des simples quotes (le HTML apr exemple) alors tu peux capturer le début d'une chaîne avec ("|') puis trouver la fin de cette chaîne avec \1. En supposant que l'ouverture de la chaîne soit la 1ere
    paire de parenthèses de ta regex.

    Dans ton cas tu veux que ta regex ne corresponde PAS à un masque suivi d'un point puis un retour à la ligne (de ce que j'ai compris). Ce point et
    retour a la ligne le doivent pas être dans la chaîne matchée. Il te faut donc un look around. Tu peux le faire avec (?!\.\n) .

    Essaye et dis si ça fonctionne.

    Tu as aussi des outils sympas pour tester tes regexes,


    https://regex101.com/

    Et une excellente documentation sur les regexes, celle qui m'a permis de
    tout en apprendre il y a bien longtemps. Pour moi c'est une référence dans
    le domaine.

    https://www.regular-expressions.info/

    Jette un oeil aux lookarounds, c'est abondament expliqué.





    Le sam. 3 juin 2023 à 13:46, benoit <[email protected]> a écrit :

    Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <[email protected]> a écrit :


    salut,

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


    J'utilise plutôt emacs et ne connais pas bien vi autrement que pour éditer des fichiers de config.


    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

    d'autre chose qu'un point "." tu veux dire ?
    Oui c'est bien ma demande virer tous les retour à la ligne et ignorer([^.\n]) ceux qui sont précédés d'un point.

    Il me manquais deux notions :
    [^.\n] non match (la négation de la correspondance)
    \1 backreference dans l'expression régulière, là par contre il va falloir que je lise une bonne doc sur le sujet, G pas tout compris ! :-)

    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.


    Un tout grand merci, je vais d’abord me documenter sur les backreferences
    !

    Avec gratitude,
    Benoît



    <div dir="auto"><div>Bonjour,<div dir="auto"><br></div><div dir="auto">J&#39;ai fait un peu de révision sur les regex hier, justement.</div><div dir="auto"><br></div><div dir="auto">Les backreferences servent à exprimer un occurrence de texte identique
    à une autre occurence précédente, capturée par des parenthèses. </div><div dir="auto"><br></div><div dir="auto">Par exemple, dans un texte contenant des chaînes délimitées soit par des doubles quotes ou des simples quotes (le HTML apr exemple)
    alors tu peux capturer le début d&#39;une chaîne avec (&quot;|&#39;) puis trouver la fin de cette chaîne avec \1. En supposant que l&#39;ouverture de la chaîne soit la 1ere paire de parenthèses de ta regex.</div><div dir="auto"><br></div><div dir="
    auto">Dans ton cas tu veux que ta regex ne corresponde PAS à un masque suivi d&#39;un point puis un retour à la ligne (de ce que j&#39;ai compris). Ce point et retour a la ligne le doivent pas être dans la chaîne matchée. Il te faut donc un look
    around. Tu peux le faire avec (?!\.\n) .</div><div dir="auto"><br></div><div dir="auto">Essaye et dis si ça fonctionne.</div><div dir="auto"><br></div><div dir="auto">Tu as aussi des outils sympas pour tester tes regexes,</div><div dir="auto"><br></div><
    div dir="auto"><br></div><div dir="auto"><a href="https://regex101.com/" target="_blank" rel="noreferrer">https://regex101.com/</a><br></div><div dir="auto"><br></div><div dir="auto">Et une excellente documentation sur les regexes, celle qui m&#39;a
    permis de tout en apprendre il y a bien longtemps. Pour moi c&#39;est une référence dans le domaine.</div><div dir="auto"><br></div><div dir="auto"><a href="https://www.regular-expressions.info/">https://www.regular-expressions.info/</a><br></div><div
    dir="auto"><br></div><div dir="auto">Jette un oeil aux lookarounds, c&#39;est abondament expliqué. </div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le
    sam. 3 juin 2023 à 13:46, benoit &lt;<a href="mailto:[email protected]" rel="noreferrer noreferrer" target="_blank">[email protected]</a>&gt; a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc
    solid;padding-left:1ex">Le vendredi 2 juin 2023 à 18:05, Marc Chantreux &lt;<a href="mailto:[email protected]" rel="noreferrer noreferrer noreferrer" target="_blank">[email protected]</a>&gt; a écrit :<br>


    &gt; salut,<br>
    &gt; <br>
    &gt; &gt; % sed -rz &#39;{s/-\n//g;s/\n//g}&#39; format.txt<br>
    &gt; <br>
    &gt; <br>
    &gt; &lt;&lt;\% sed -rz &#39;s/-\n//g; s/([^.\n])\n/\1/g&#39; | tr -s &#39; &#39; | fmt -w72<br>
    &gt; <br>
    &gt; Je suis pas sur d&#39;avoir compris le pb.<br>
    &gt; <br>
    &gt; Je voudrais reformater du texte en colonne,<br>
    &gt; qui a été just-<br>
    &gt; ifié avec des retours à la ligne (\n) et<br>
    &gt; est - de coupure de mot.<br>
    &gt; <br>
    &gt; %<br>
    &gt; <br>
    &gt; Si la commande correspond bien à ton besoin, tu peux directement<br>
    &gt; l&#39;utiliser dans vi grace à un range.<br>
    &gt; <br>

    J&#39;utilise plutôt emacs et ne connais pas bien vi autrement que pour éditer des fichiers de config.<br>


    &gt; si tu as fais une selection visuelle, tappes<br>
    &gt; <br>
    &gt; !sed -rz &#39;s/-\n//g; s/([^.\n])\n/\1/g&#39; | tr -s &#39; &#39; | fmt -w72<br>
    &gt; <br>
    &gt; les prochains usages de ! rappellent le dernier filtre, tu n&#39;auras<br> &gt; plus qu&#39;a taper !! au lieu de ! et rappeler la commande.<br>
    &gt; <br>
    &gt; Évidement ça marche avec tous les ranges :)<br>
    &gt; <br>
    &gt; astuce: mettre le filtre dans un fichier à part pour en faciliter la<br> &gt; maintenance:<br>
    &gt; <br>
    &gt; :sp monfiltre<br>
    &gt; :!chmod a+x %<br>
    &gt; <br>
    &gt; et ensuite tu peux écrire ton filtre en espaçant un peu et en commentant<br>
    &gt; <br>
    &gt; #!/bin/sh<br>
    &gt; # note1: je ne vire le retour à la ligne que si il est précédé<br> &gt; # d&#39;autre chose qu&#39;un espace<br>

    d&#39;autre chose qu&#39;un point &quot;.&quot; tu veux dire ?<br>
    Oui c&#39;est bien ma demande virer tous les retour à la ligne et ignorer([^.\n]) ceux qui sont précédés d&#39;un point.<br>

    Il me manquais deux notions :<br>
    [^.\n] non match (la négation de la correspondance) <br>
    \1 backreference dans l&#39;expression régulière, là par contre il va falloir que je lise une bonne doc sur le sujet, G pas tout compris ! :-)<br>

    &gt; sed -rz &#39;<br>
    &gt; s/-\n//g<br>
    &gt; s/([^.\n])\n/\1/g # cf. note1<br>
    &gt; &#39; |<br>
    &gt; tr -s &#39; &#39; |<br>
    &gt; fmt -w72<br>
    &gt; <br>
    &gt; et finalement<br>
    &gt; <br>
    &gt; filtrer avec &lt;monrange&gt;!./monfiltre<br>
    &gt; <br>
    &gt; <br>
    &gt; je fais concis pour aller vite. n&#39;hésite pas à me demander de plus<br>
    &gt; amples explications si cette piste de plait.<br>
    &gt; <br>

    Un tout grand merci, je vais d’abord me documenter sur les backreferences  !<br>

    Avec gratitude,<br>
    Benoît<br>

    </blockquote></div></div></div>

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From benoit@21:1/5 to All on Sat Jun 3 13:50:01 2023
    Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <[email protected]> a écrit :


    salut,

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


    J'utilise plutôt emacs et ne connais pas bien vi autrement que pour éditer des fichiers de config.


    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

    d'autre chose qu'un point "." tu veux dire ?
    Oui c'est bien ma demande virer tous les retour à la ligne et ignorer([^.\n]) ceux qui sont précédés d'un point.

    Il me manquais deux notions :
    [^.\n] non match (la négation de la correspondance)
    \1 backreference dans l'expression régulière, là par contre il va falloir que je lise une bonne doc sur le sujet, G pas tout compris ! :-)

    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.


    Un tout grand merci, je vais d’abord me documenter sur les backreferences !

    Avec gratitude,
    Benoît

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

    J'utilise plutôt emacs et ne connais pas bien vi autrement que pour
    éditer des fichiers de config.

    /!\: message à caractère informatif sans volonté prosélyte

    une des raisons qui me font aimer vim est justement la simplicité avec laquelle tu peux interagir avec les autres commandes. j'ai fais toute
    une conférence là dessus (c'est en euuuhh-anglais)

    https://github.com/eiro/talk-acme-changed-my-life

    je fais des demos qui illustrent ce que je te proposais de faire.

    Il me manquais deux notions :
    [^.\n] non match (la négation de la correspondance
    \1 backreference dans l'expression régulière, là par contre il va
    falloir que je lise une bonne doc sur le sujet, G pas tout compris !

    ah ben sans rentrer dans les détails (attention: le -r est important)

    soit une liste de tu veux transformer. disons la liste suivante:

    Manipulation - Au commencement, le troisième homme - Ep 1⧸6 - Documentaire sur l'affaire Clearstream [vzKpalcKfF4].webm
    Manipulation - Clearstream, la banque des banques - Ep 2⧸6 - Documentaire sur l'affaire Clearstream [RaDFbeO94Rg].webm
    Manipulation - Jean-Luc Lagardère, le scénario noir - Ep 3⧸6 - l'affaire Clearstream - Y [a7glzdg_1ng].webm
    Manipulation - Karachi et le trésor de guerre - Ep 5⧸6 - l'affaire Clearstream - Y [SePDLJt85bw].webm
    Manipulation - La république des mallettes - Ep 6⧸6 - l'affaire Clearstream - Y [QrdpPCZfA1w].webm
    Manipulation - Taïwan, naissance de la zone grise - Ep 4⧸6 - l'affaire Clearstream - Y [qYzEW7rZkn0].webm

    en la liste suivante

    1_Au_commencement_le_troisième_homme.webm 2_Clearstream_la_banque_des_banques.webm 3_Jean-Luc_Lagardère_le_scénario_noir.webm 5_Karachi_et_le_trésor_de_guerre.webm
    6_La_république_des_mallettes.webm
    4_Taïwan_naissance_de_la_zone_grise.webm

    la première étape c'est de trouver la structure

    Manipulation - (TITRE) - Ep 1⧸(NUMERO) - (RESTE)

    que je veux transformer en

    (NUMERO)_(TITRE).webm

    * le titre arrive en premier (\1) et est composé de n'importe quoi (.*)
    * le numéro arrive en second (\2) et est composé d'un numéro
    * j'aurais pu écrire [0-9]
    * je suis une flême: dans notre cas, '.' fait bien l'affaire
    * tout le reste (.*), on s'en fout

    j'ai donc le motif /^Manipulation - (.*) - Ep 1⧸(.) - .*/
    que je veux transformer en \2_\1.webm

    ensuite je repasse derrière pour virer les caractères étranges:

    s/[ ,]+/_/g

    donc si je fais

    sed -r '
    # afficher le nom actuel
    p
    # modifier la structure
    s!^Manipulation - (.*) - Ep (.).*!\2_\1.webm!
    # virer les caractères pourris
    s/[ ,]+/_/g
    ' <<%


    J'ai une nouvelle liste avec pour chaque épisode:
    * nouveau nom
    * ancien nom

    si je demande à xargs de prendre ces noms 2 par 2 pour les filer
    à mv, je fais du renommage de masse:

    { sed -r '
    # afficher le nom actuel
    p
    # modifier la structure
    s!^Manipulation - (.*) - Ep (.).*!\2_\1.webm!
    # virer les caractères pourris
    s/[ ,]+/_/g
    ' | xargs -d'\n' -n2 mv <<%


    et tout ça quand tu le fais depuis vim c'est très interactif parceque
    chaque étape est du texte que tu peux modifier.

    elle est pas belle la vie ?

    à nouveau: si je suis allé trop vite, hésite pas à demander :)

    cordialement,
    marc

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