• Re: sed remplacement de "=" par espace

    From Basile Starynkevitch@21:1/5 to All on Sun Mar 16 09:10:01 2025
    On Sun, 2025-03-16 at 08:45 +0100, Benoît Barbier wrote:
    Bonjour,


    sed "s/[""'’`;:,.=]/ /g

    Pourquoi ça trouve pas les "=" ?
    Est-ce qu'il y aurait plusieurs signe "=" dans l'UTF8 ?


    Le problème est le traitement par le shell des arguments.

    Peut-être que sed 's/[\"\'\`\’\`;:.=]/ /g' pourrait mieux convenir.

    https://www.gnu.org/software/bash/manual/bash.html#Quoting

    Cordialement
    --
    Basile STARYNKEVITCH <basile@starynkevitch.net>
    8 rue de la Faïencerie
    92340 Bourg-la-Reine, France
    http://starynkevitch.net/Basile & https://github.com/bstarynk
    & https://github.com/RefPerSys/RefPerSys/

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Beno=C3=AEt_Barbier?=@21:1/5 to All on Sun Mar 16 08:50:01 2025
    Bonjour,


    sed "s/[""'’`;:,.=]/ /g

    Pourquoi ça trouve pas les "=" ?
    Est-ce qu'il y aurait plusieurs signe "=" dans l'UTF8 ?

    N'a pas fonctionné avec la chaîne = "abcd-=-efgh" copiée-collée du terminal.

    Merci d'avance

    --
    Benoît

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Sun Mar 16 12:00:01 2025
    Le 16 mars 2025 Benoît Barbier a écrit :

    sed "s/[""'’`;:,.=]/ /g

    Pourquoi ça trouve pas les "=" ?
    Est-ce qu'il y aurait plusieurs signe "=" dans l'UTF8 ?

    N'a pas fonctionné avec la chaîne = "abcd-=-efgh" copiée-collée du terminal.

    Si je copie tel que tes bouts de texte ça plante sed à cause des " et `
    non protégés. De mon côté ça donne ça :

    $ echo "abcd-=-efgh" | sed "s/[\"'\`:,.=]/ /g"
    abcd- -efgh

    Donne la commande exacte que tu passes et du résultat si tu as toujours
    un problème avec =

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Beno=C3=AEt_Barbier?=@21:1/5 to All on Sun Mar 16 13:00:01 2025
    Le 16/03/25 à 11:55, Michel Verdier a écrit :
    Le 16 mars 2025 Benoît Barbier a écrit :

    sed "s/[""'’`;:,.=]/ /g

    Ici j'ai mal copié collé ls '"' de fin, mais je l'utilisais dans mes tests

    sed "s/[""'’`;:,.=]/ /g"


    Pourquoi ça trouve pas les "=" ?
    Est-ce qu'il y aurait plusieurs signe "=" dans l'UTF8 ?

    N'a pas fonctionné avec la chaîne = "abcd-=-efgh" copiée-collée du terminal.

    Si je copie tel que tes bouts de texte ça plante sed à cause des " et `
    non protégés. De mon côté ça donne ça :

    $ echo "abcd-=-efgh" | sed "s/[\"'\`:,.=]/ /g"
    abcd- -efgh

    Donne la commande exacte que tu passes et du résultat si tu as toujours
    un problème avec =


    J'ai du foirer un truc en ajoutant "="

    J'ai utilisé la réponse de @Basile STARYNKEVITCH

    Le problème est le traitement par le shell des arguments.

    Peut-être que sed 's/[\"\'\`\’\`;:.=]/ /g' pourrait mieux convenir.

    https://www.gnu.org/software/bash/manual/bash.html#Quoting

    Mais je constate que je dois quand même mettre des " plutôt que des '
    pour encadrer :

    sed "s/[\"\'\`\’\`;:.=!#]/ /g"

    Si non le terminal (zsh) me fait un :

    dquote>

    au lieux de considérer que c'est correctement fermé.

    Ce qui compte c'est que ça marche, mais si je pouvais comprendre la
    cause, je suis preneur d'une explication.

    D'après ce que j'ai compris du lien ci-dessus au paragraphe 3.1.2.3
    Double Quotes, pour préserve la valeur littérale, on a le choix entre backslash ‘\’ et double quotes(‘"’)
    Cf.
    https://www.gnu.org/software/bash/manual/bash.html#Double-Quotes

    Mais visiblement je dois faire backslash ‘\’ pour préserve la valeur littérale et double quotes(‘"’) pour une fin de ligne correcte et éviter que le terminal(zsh) ne passe en :

    dquote>

    C'est bien ça ?

    Merci

    --
    Benoît

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Basile Starynkevitch@21:1/5 to All on Sun Mar 16 17:30:01 2025
    On Sun, 2025-03-16 at 12:52 +0100, Benoît Barbier wrote:


    Le 16/03/25 à 11:55, Michel Verdier a écrit :
    Le 16 mars 2025 Benoît Barbier a écrit :

    sed "s/[""'’`;:,.=]/ /g

    Ici j'ai mal copié collé ls '"' de fin, mais je l'utilisais dans mes tests

    sed "s/[""'’`;:,.=]/ /g"


    Pourquoi ça trouve pas les "=" ?
    Est-ce qu'il y aurait plusieurs signe "=" dans l'UTF8 ?

    N'a pas fonctionné avec la chaîne = "abcd-=-efgh" copiée-collée du terminal.

    Si je copie tel que tes bouts de texte ça plante sed à cause des " et ` non protégés. De mon côté ça donne ça :

    $ echo "abcd-=-efgh" | sed "s/[\"'\`:,.=]/ /g"
    abcd- -efgh

    Donne la commande exacte que tu passes et du résultat si tu as toujours
    un problème avec =


    J'ai du foirer un truc en ajoutant "="

    J'ai utilisé la réponse de @Basile STARYNKEVITCH

    Le problème est le traitement par le shell des arguments.

    Peut-être que sed 's/[\"\'\`\’\`;:.=]/ /g' pourrait mieux convenir.

    https://www.gnu.org/software/bash/manual/bash.html#Quoting

    Mais je constate que je dois quand même mettre des " plutôt que des '
    pour encadrer :

    sed "s/[\"\'\`\’\`;:.=!#]/ /g"

    Si non le terminal (zsh) me fait un :

    dquote>

    au lieux de considérer que c'est correctement fermé.



    Lz shell zsh est différent de GNU bash et a des règles de quotation différente.
    La documentation à utiliser est donc différente.

    https://zsh.sourceforge.io

    Une autre solution serait d'écrire un programme C (ou Ocaml ou Rust) qui execute
    /bin/sed comme une convient et de le compiler ou même qui fait le remplacement espéré.

    Je le laisse en exercice au lecteur. On pourait imaginer y utiliser https://man7.org/linux/man-pages/man3/regex.3.html https://man7.org/linux/man-pages/man7/regex.7.html

    En C++ Qt offre aussi des possibilités nombreuses (et peut-être utilisé en dehors d'applications graphiques). https://www.qt.io/ et aussi http://www.fox-toolkit.org/

    Je n'ai d'ailleurs pas compris le problème originel qui est à résoudre. De mon
    point de vue manquent à la question le contexte du problème, a expliquer en plusieurs dizaines de phrases françaises.

    S'il s'agit de traiter des fichiers encodés en UTF-8 alors la bibliothèque https://www.gnu.org/software/libunistring/ est adaptée.

    On pourrait tirer profit de la bibliothèque Glib https://fr.wikipedia.org/wiki/GLib

    Je rapelle qu'il existe d'autres encodages (dont ISO-LATIN-1, KOI-8 et d'autres)
    et la complexité d'Unicode https://fr.wikipedia.org/wiki/Unicode

    Je n'ai pas comprise le problème réel à résoudre et son contexte, et une explication détaillée me parait nécessaire et manquer.

    Cordialement
    --
    Basile STARYNKEVITCH <basile@starynkevitch.net>
    8 rue de la Faïencerie
    92340 Bourg-la-Reine, France
    http://starynkevitch.net/Basile & https://github.com/bstarynk

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Chantreux@21:1/5 to All on Wed Mar 19 18:30:01 2025
    salut Benoît,

    je prend le train en marche un peu tard et je sais pas si tu es
    arrivé à tes fins mais:

    On Sun, Mar 16, 2025 at 12:52:47PM +0100, Benoît Barbier wrote:

    Il y a plusieurs problèmes dans cette ligne

    sed "s/[""'’`;:,.=]/ /g"

    * quand tu utilises "", tu permets l'expansion hors le symbole `
    permet d'executer une commande:

    echo "hello `hostname`"

    pour éviter ça, il faut utiliser la simple quote:

    echo 'hello `hostname`'

    dans ton cas en plus:

    * la backquote n'est pas fermée
    * même si tu la fermes, ce n'est pas une expression valide

    echo "hello `hostname"

    un autre problème: écrire "A""B" revient à écrire AB et donc ton
    script ne trouvera jamais les ""

    du coup: comment introduire un ' dans une chaine protégée par des '?
    , en faisant 3 chaines:

    echo 'A'"'"'B' # 'A' puis "'" puis 'B'
    echo 'A'\''B' # 'A' puis \' puis 'B'

    si c'est pas assez lisible/maintenable pour toi, passe par une variable intermédiaire:

    Q=\' # simple quote
    echo 'A'$Q'B'

    sed 's/["'\''’`;:,.=]/ /g'

    autre option: tu gardes les double quotes et tu protèges les 3 symboles problèmatiques ( ', " et ` )

    sed "s/[\"\'\`’;:,.=]/ /g"


    https://www.gnu.org/software/bash/manual/bash.html#Quoting

    bash et sa doc ont ça en commun d'être inutilement grosse par rapport à
    la concurrence. je te conseille de regarder la section quoting du man
    dash.

    Si non le terminal (zsh) me fait un :

    dquote>
    au lieux de considérer que c'est correctement fermé.

    c'est parce que ' ne peut être fermé que quand tu auras fermé ` ce qui
    n'est pas le cas dans ton exemple.

    puisque tu mentionnes zsh, tu peux aussi utiliser l'option rcquotes qui
    permet de quoter comme avec le shell rc (qui remplaçait sh dans la
    dernière version d'unix et qui est le shell par defaut dans plan9):

    pour avoir une chaine protégée par des quotes avec une quote dedans, tu doubles la quote dans le texte. donc tu peux écrire

    setopt rcquotes
    sed 's/["''`’;:,.=]/ /g'

    a+

    --
    Marc Chantreux

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Beno=C3=AEt_Barbier?=@21:1/5 to All on Fri Mar 21 12:10:01 2025
    Salut Marc,

    Un grand merci pour ton aide.
    Je réponds un peu tardivement à ceux qui ont pris le temps de m'aider.
    Un tout grand merci.

    j'éprouvais trop de difficultés à m'y retrouver dans la doc de bash.
    Du coup, je l'ai fait en python en tenant compte des conseils.

    L'avantage de python, c'est sa popularité, j'ai trouvé une réponse à
    chaque question, avec des exemples et des explications.
    Ce qui m’a permis d’écrire mon sans m'y connaître au départ.

    Je n'ai pas fait exactement comme tu me l'as indiqué, juste pour me
    forcer à comprendre au lieu de faire un copier-coller.
    En python re.sub()

    Cf.
    https://docs.python.org/3/library/re.html#re.sub

    result = re.sub("[\"'’`´;,:=!#]", " ", result)

    Je ne suis pas sûr, mais ça semble fonctionner

    Avec gratitude,

    --
    Benoît

    Le 19/03/25 à 18:25, Marc Chantreux a écrit :
    salut Benoît,

    je prend le train en marche un peu tard et je sais pas si tu es
    arrivé à tes fins mais:

    On Sun, Mar 16, 2025 at 12:52:47PM +0100, Benoît Barbier wrote:

    Il y a plusieurs problèmes dans cette ligne

    sed "s/[""'’`;:,.=]/ /g"

    * quand tu utilises "", tu permets l'expansion hors le symbole `
    permet d'executer une commande:

    echo "hello `hostname`"

    pour éviter ça, il faut utiliser la simple quote:

    echo 'hello `hostname`'

    dans ton cas en plus:

    * la backquote n'est pas fermée
    * même si tu la fermes, ce n'est pas une expression valide

    echo "hello `hostname"

    un autre problème: écrire "A""B" revient à écrire AB et donc ton
    script ne trouvera jamais les ""

    du coup: comment introduire un ' dans une chaine protégée par des '?
    , en faisant 3 chaines:

    echo 'A'"'"'B' # 'A' puis "'" puis 'B'
    echo 'A'\''B' # 'A' puis \' puis 'B'

    si c'est pas assez lisible/maintenable pour toi, passe par une variable intermédiaire:

    Q=\' # simple quote
    echo 'A'$Q'B'

    sed 's/["'\''’`;:,.=]/ /g'

    autre option: tu gardes les double quotes et tu protèges les 3 symboles problèmatiques ( ', " et ` )

    sed "s/[\"\'\`’;:,.=]/ /g"


    https://www.gnu.org/software/bash/manual/bash.html#Quoting

    bash et sa doc ont ça en commun d'être inutilement grosse par rapport à
    la concurrence. je te conseille de regarder la section quoting du man
    dash.

    Si non le terminal (zsh) me fait un :

    dquote>
    au lieux de considérer que c'est correctement fermé.

    c'est parce que ' ne peut être fermé que quand tu auras fermé ` ce qui n'est pas le cas dans ton exemple.

    puisque tu mentionnes zsh, tu peux aussi utiliser l'option rcquotes qui permet de quoter comme avec le shell rc (qui remplaçait sh dans la
    dernière version d'unix et qui est le shell par defaut dans plan9):

    pour avoir une chaine protégée par des quotes avec une quote dedans, tu doubles la quote dans le texte. donc tu peux écrire

    setopt rcquotes
    sed 's/["''`’;:,.=]/ /g'

    a+


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Beno=C3=AEt_Barbier?=@21:1/5 to All on Fri Mar 21 12:30:01 2025
    Le 21/03/25 à 12:19, Marc Chantreux a écrit :
    salut,

    Un script qui convertit les noms de fichier ou de répertoire en camelCase >> après avoir enlevé les caractères spéciaux ou accentués.
    Par exemple change :
    – les "éèêÉÈÊ" en ‘e’ ;
    – les "àÀâÂ" en 'a'
    – les "çÇ" en 'c'
    – les "()" et "[]" en espace
    – les ""'’`´;,:=!#" en espace

    t'es pas en train de réécrire detox par hasard ? :)



    Oups la boulette...
    Trop tard, j'ai écris ce script pour rien ! :-(

    --
    Benoît

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Chantreux@21:1/5 to All on Fri Mar 21 12:30:01 2025
    salut,

    Un script qui convertit les noms de fichier ou de répertoire en camelCase après avoir enlevé les caractères spéciaux ou accentués.
    Par exemple change :
    – les "éèêÉÈÊ" en ‘e’ ;
    – les "àÀâÂ" en 'a'
    – les "çÇ" en 'c'
    – les "()" et "[]" en espace
    – les ""'’`´;,:=!#" en espace

    t'es pas en train de réécrire detox par hasard ? :)


    --
    Marc Chantreux
    Pôle CESAR (Calcul et services avancés à la recherche)
    Université de Strasbourg
    14 rue René Descartes,
    BP 80010, 67084 STRASBOURG CEDEX
    03.68.85.60.79

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Chantreux@21:1/5 to All on Fri Mar 21 12:40:02 2025
    salut,

    On Fri, Mar 21, 2025 at 12:24:40PM +0100, Benoît Barbier wrote:
    t'es pas en train de réécrire detox par hasard ? :)
    Oups la boulette...
    Trop tard, j'ai écris ce script pour rien ! :-(

    pas du tout: tu as appris au passage et c'est super!

    par contre la prochaine fois:
    * demande avant d'écrire
    * sois plus clair sur tes intentions quand tu postes un truc
    (on aurait pu te rediriger vers detox bien plus tôt si le titre de ton
    message avait été "renommer les fichiers en supprimant les caractères
    étranges")

    bon WE à toi

    Marc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Marc Chantreux@21:1/5 to elguero eric on Fri Mar 21 12:50:02 2025
    On Fri, Mar 21, 2025 at 11:29:24AM +0000, elguero eric wrote:

    Un script qui convertit les noms de fichier ou de répertoire en camelCase après avoir enlevé les caractères spéciaux ou accentués.
    Par exemple change :
    – les "éèêÉÈÊ" en ‘e’ ;
    – les "àÀâÂ" en 'a'
    – les "çÇ" en 'c'
    – les "()" et "[]" en espace
    – les ""'’`´;,:=!#" en espace


    c'est un truc à se retrouver avec plusieurs
    fichiers qui ont le même nom...

    c'est géré par detox:

    set /tmp/detox été- '(été)'
    mkdir -p $1
    cd $1
    shift
    touch "$@"
    detox "$2"

    Cannot rename (été) to été-: file already exists

    a+

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?Q?Beno=C3=AEt_Barbier?=@21:1/5 to All on Fri Mar 21 12:20:01 2025
    Le 16/03/25 à 17:24, Basile Starynkevitch a écrit :

    Lz shell zsh est différent de GNU bash et a des règles de quotation différente.
    La documentation à utiliser est donc différente.

    https://zsh.sourceforge.io

    Une autre solution serait d'écrire un programme C (ou Ocaml ou Rust) qui execute
    /bin/sed comme une convient et de le compiler ou même qui fait le remplacement
    espéré.

    Je le laisse en exercice au lecteur. On pourait imaginer y utiliser https://man7.org/linux/man-pages/man3/regex.3.html https://man7.org/linux/man-pages/man7/regex.7.html

    En C++ Qt offre aussi des possibilités nombreuses (et peut-être utilisé en dehors d'applications graphiques). https://www.qt.io/ et aussi http://www.fox-toolkit.org/


    Excellente idée, je l’ai suivie et j’ai écrit mon script en python, ce qui m’a permis de trouver une réponse à toutes mes questions à chaque recherche sur le net, sans trop m’y connaître au départ.

    Je n'ai d'ailleurs pas compris le problème originel qui est à résoudre. De mon
    point de vue manquent à la question le contexte du problème, a expliquer en plusieurs dizaines de phrases françaises.

    Un script qui convertit les noms de fichier ou de répertoire en
    camelCase après avoir enlevé les caractères spéciaux ou accentués.
    Par exemple change :
    – les "éèêÉÈÊ" en ‘e’ ;
    – les "àÀâÂ" en 'a'
    – les "çÇ" en 'c'
    – les "()" et "[]" en espace
    – les ""'’`´;,:=!#" en espace
    Convertis chaque item du nom de fichier séparé par un espace en
    minuscule, puis mets en majuscule la première lettre de chaque item à
    partir du deuxième, puis enlève tous les espaces.
    Prend en compte de multiples extensions, telles que nomFichier.tar.gz et
    au passage enlève les caractères spéciaux des extensions et les met en minuscules.
    Par exemple un nom de fichier tel que :
    dignissim :mÊattis dictu`m (pulvinar) o`rnare at [Fermentum]
    sapien .t"xt.târ.GZ
    devient :
    dignissimMeattisDictuMPulvinarORnareAtFermentumSapien.txt.tar.gz

    Mon script semble fonctionner.

    Merci pour ces conseils
    Avec gratitude,

    --
    Benoît

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

    On Fri, Mar 21, 2025 at 12:03:29PM +0100, Benoît Barbier wrote:
    Un grand merci pour ton aide.

    je t'en prie.

    j'éprouvais trop de difficultés à m'y retrouver dans la doc de bash.

    c'est tellement dommage! vendre son âme au diable pour 2 symboles mal
    placés :)

    Je ne suis pas sûr, mais ça semble fonctionner

    si j'ai bien compris ton problème, sed "s/[\"\'\`’;:,.=]/ /g" fonctionne aussi

    genre

    <<\% sed "s/[\"\'\`’;:,.=]/(&)/g"
    les trucs comme " ou ' ou ` mais aussi ; : , . et = sont à éviter

    me donne bien:

    les trucs comme (") ou (') ou (`) mais aussi (;) (:) (,) (.) et (=) sont à éviter

    en plus c'est bien plus cours et surtout ça tourne avec juste sed (genre
    dans un busybox) là ou tu commences à te trainer une grosse dépendance (python)

    je dis pas qu'il faut pas utiliser un langage interprété quand ça rend service dans dans le cas présent c'est utiliser un char d'assaut pour
    tuer une fourmi. je dirais même que c'est un usage contre-productif de
    python.

    bien à toi


    --
    Marc Chantreux
    Pôle CESAR (Calcul et services avancés à la recherche)
    Université de Strasbourg
    14 rue René Descartes,
    BP 80010, 67084 STRASBOURG CEDEX
    03.68.85.60.79

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