Re: Re : Re: sed ignorer une occurence

2023-06-05 Par sujet Marc Chantreux
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



Re: Re : Re: sed ignorer une occurence

2023-06-03 Par sujet Dethegeek
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  a écrit :

> Le vendredi 2 juin 2023 à 18:05, Marc Chantreux  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 !./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
>
>


Re : Re: sed ignorer une occurence

2023-06-03 Par sujet benoit
Le vendredi 2 juin 2023 à 18:05, Marc Chantreux  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 !./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



Re: sed ignorer une occurence

2023-06-02 Par sujet Marc Chantreux
salut,

Le Thu, Jun 01, 2023 at 10:46:00AM +, 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 !./monfiltre

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

cordialement,
marc



Re: sed ignorer une occurence

2023-06-02 Par sujet l0f4r0
Hello,

1 juin 2023, 12:46 de benoit...@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



Re: sed ignorer une occurence

2023-06-01 Par sujet Michel Verdier
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))



Re : Re: sed ignorer une occurence

2023-06-01 Par sujet benoit
Le jeudi 1 juin 2023 à 20:54, Michel Verdier  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



Re: sed ignorer une occurence

2023-06-01 Par sujet Michel Verdier
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))



Re : Re: sed ignorer une occurence

2023-06-01 Par sujet benoit


Le jeudi 1 juin 2023 à 16:01, Michel Verdier  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

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis 
sagittis libero at semper. In lacinia in lorem sit amet semper. Nulla 
pellentesque venenatis dolor, et dapibus dolor feugiat ut. Aenean purus 
nunc, elementum vel lectus sed, blandit laoreet ipsum. Aenean in augue 
lobortis leo accumsan maximus. Maecenas ante est, ornare vel 
ullamcorper sodales, ultrices sit amet augue. Donec ut augue eget odio 
tempus condimentum sit amet eu tortor.

Aliquam tincidunt lacinia nulla eu pretium. Nunc eu velit velit. Mauris 
a volutpat odio, vitae molestie tellus. Proin fermentum tempus tempor. 
Maecenas pellentesque consequat quam, in fringilla lectus mollis nec. 
Ut tristique magna hendrerit, gravida metus id, dapibus dui. Proin sed 
consequat risus. Aenean eu placerat leo. Suspendisse pulvinar augue 
porttitor risus tempus tristique. Donec mauris nulla, suscipit non arcu 
non, ullamcorper feugiat dui. Vestibulum at orci cursus, elementum 
tellus ut, accumsan ipsum.

Nam luctus neque quis arcu posuere, vulputate volutpat magna efficitur. 
Maecenas ut leo quis est molestie faucibus. Nam commodo est ac elit 
molestie hendrerit. Aliquam ut aliquet mauris. Maecenas magna magna, 
volutpat cursus ligula vel, tristique laoreet ante. Maecenas malesuada 
ante fringilla, sagittis massa fringilla, rutrum ligula. Nullam gravida 
dolor ut dolor faucibus, ac posuere mauris lobortis. Fusce tempor 
sodales enim, et lobortis arcu mattis vehicula. Ut posuere tristique 
diam id lobortis. Integer porta neque sit amet erat aliquet consectetur 
sed quis mi. Maecenas ut maximus diam. Sed rhoncus lorem vel eros 
dictum, sit amet vehicula dui mollis. Mauris euismod felis hendrerit, 
tempus sapien quis, commodo eros. Vestibulum id auctor libero, non 
accumsan enim. Nulla facilisi. Mauris vel lacinia sem.

Aliquam nec molestie enim. Cras ac justo eros. Vestibulum ante ipsum 
primis in faucibus orci luctus et ultrices posuere cubilia curae; Fusce 
eget felis congue, vulputate est eget, bibendum sapien. Donec 
scelerisque erat vitae massa molestie sodales. Ut lorem quam, varius ac 
purus in, cursus pulvinar ante. Phasellus et mi sed elit molestie 
accumsan. Ut venenatis suscipit urna quis commodo. Aliquam suscipit 
aliquet magna, vitae condimentum ipsum aliquet in. Pellentesque 
condimentum est eu lorem elementum luctus. Nunc venenatis justo sit 
amet dui rutrum scelerisque. Duis ut pellentesque ante, ornare 
vulputate dui. Etiam congue sed ante sit amet euismod. Maecenas rutrum 
laoreet sapien ut tincidunt. Maecenas commodo eros sit amet posuere 
varius.

Re: sed ignorer une occurence

2023-06-01 Par sujet Michel Verdier
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))



Re : Re: sed ignorer une occurence

2023-06-01 Par sujet benoit
Le jeudi 1 juin 2023 à 15:21, Michel Verdier  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
 



Re: sed ignorer une occurence

2023-06-01 Par sujet Michel Verdier
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))



Re : Re: sed ignorer une occurence

2023-06-01 Par sujet benoit
Bonjour,

Le jeudi 1 juin 2023 à 12:56, Basile Starynkevitch  a 
écrit :

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

A je ne connais pas je vais aller voir

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

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

(defun ConvertRet ()
"Convertis 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 ()
"Converti un text jutifié avec des retours à la lign."
(interactive)
(mark-whole-buffer)
(ConvertRet (region-beginning) (region-end)))

Re: sed ignorer une occurence

2023-06-01 Par sujet Basile Starynkevitch


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
(only mine opinions / les opinions sont miennes uniquement)
92340 Bourg-la-Reine, France
web page: starynkevitch.net/Basile/


sed ignorer une occurence

2023-06-01 Par sujet benoit
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

--
Benoît

Envoyé avec la messagerie sécurisée [Proton Mail.](https://proton.me/)