BASH alias avec des guillemets ( " ) et des apostrophes ( ' ) imbriquées

Bonjour,

Voici comment j’ai résolu le problème suivant

j’utilise l’ alias «bouchetrous» suivant:
alias bouchetrous="rename 's/[,\s]/_/g' "
qui remplace les blancs et les virgules par un souligné : « _ »

Problème:
comment ajouter l’ apostrophe «’»?

alias bouchetrous="rename 's/[\',\s]/_/g' "
renvoie une erreur

si je supprime les «’» de l’argument de rename, ça marche mais les blancs ne sont plus reconnus, (même si je remplace le « \s » par un espace.) Dans ce cas aucune erreur n’est affichée, mais les blancs ne sont pas remplacés.

Il y a bien d’autres solutions, comme detox, ou l’utilisation d’une fonction qui ferait successivement les 2 types de remplacement, mais ma paresse mal négociée se cache derrière ma curiosité.

La complexité des jeux d’apostrophes ( ’ ) et de guillemets ( " ) imbriqués avec bash me dépasse encore.

Comment j’ai trouvé la solution:

La commande en ligne suivante fait le travail:
rename "s/[\'\s,]/_/g"

Finalement, la solution est:
alias bouchetrous="rename \"s/[\'\s,]/_/g\" "

Mon explication (corrigez-moi si je me trompe SVP):

La définition d’alias nécessite soit des apostrophes soit des guillemets (si des termes doivent être interprétés).
La liste des argument du script Perl « rename » doit être protégée d’interprétations de bash, si possible par des apostrophes.
Le regroupement dans une regex Perl entre [crochets droits] peut utiliser l’apostrophe comme simple caractère à condition qu’il soit échappé. Bref ce casse-tête a tout de même une solution.
On peut échapper les guillemets dans des guillemets, pas des apostrophes dans les apostrophes, car bash interprète ce qui est entre guillemets, pas ce qui est entre apostrophe.

Une poupée russe à 3 niveaux:
1 bash (définition d’alias), puis
2 bash (lancement de rename par l’alias), puis
3 Perl (script « rename »).

1 J'aime

Bonjour

Je n’ai fait aucun tests pour vérifier, mais tu pourrais peut-être utiliser
la valeur hexadécimale ASCII qui correspond au caractère apostrophe,
et qui est : 27

mic@deb12:~$ echo -e 'une apostrophe -> \x27'
une apostrophe -> '
mic@deb12:~$ 
1 J'aime

Ma solution fonctionne sur tous mes tests.
Mais je n’avais pas pensé à cette option plus «programmeur»
Avec votre solution, on peut effectivement écrire indifféremment :

alias bouchetrous='rename "s/[\x27\s,]/_/g" '

ou

alias bouchetrous="rename \"s/[\x27\s,]/_/g\" "

J’avais proposé d’utiliser l’ASCII, mais il est très limité comparé à l’UNICODE.

Ça peut permettre, par exemple,
de différencier un point virgule d’un point d’interrogation grec

mic@deb12:~$ echo -e "un point virgule -> \u003b"
un point virgule -> ;
mic@deb12:~$ 
mic@deb12:~$ echo -e "un point d'interrogation grec -> \u037e"
un point d'interrogation grec -> ;
mic@deb12:~$ 

Une page web permettant de retrouver tous les caractères UNICODE
(en fonction de ce que pourra afficher votre navigateur web).

1 J'aime

Tiens, c’est marrant, moi, je fais ça :

┌ (almtesh@Thorn + 0) (08/08/23 - 9:07:47) (6.69 - 0%) (~)
└% echo 'une apostophe ->'"'"' pas mal, hein ?'
une apostophe ->' pas mal, hein ?
┌ (almtesh@Thorn + 0) (08/08/23 - 9:08:22) (5.51 - 0%) (~)
└%

Mais, avec ma façon de faire, on peu se perdre, d’autant que là, il s’agit de quelque chose qui se trouve déjà entre guillemets, ce qui veux dire qu’il faut échapper les guillemets, ce qui peut vite devenir un enfer à écrire et à comprendre.

Oui, c’est simplement pour une question de lisibilité,
et la solution proposée par josephtux fonctionne aussi bien.

Le problème initial imposait en plus l’encadrement dans une définition d’alias, donc:

alias apostrophe="'une apostophe ->'\"'\"' pas mal, hein ?'
une apostophe ->' pas mal, hein ?'"
┌ (almtesh@Thorn + 0) (08/08/23 - 9:

L’utilisation du code ASCII ou mieux, UTF est tout de même plus lisible.

Merci pour cette précision.
Une autre: la commande « unicode ‹ ; › » , par exemple , est immédiatement accessible hors connection.