Y a-t-il une implémentation de regex qui permet de remplacer le groupe dans regex par une version en minuscule de celui-ci?
En Perl, vous pouvez faire:
$string =~ s/(some_regex)/lc($1)/ge;
L'option /e
Entraîne l'évaluation de l'expression de remplacement comme du code Perl, dont la valeur de retour est utilisée comme valeur de remplacement finale. lc($x)
renvoie la version en minuscule de $x
. (Pas sûr mais je suppose que lc()
gérera correctement les caractères internationaux dans les versions récentes de Perl.)
/g
Signifie correspondance globale. Omettez le g
si vous ne voulez qu'un seul remplacement.
Si votre version regex le prend en charge, vous pouvez utiliser\L, comme dans un shell POSIX:
sed -r 's/(^.*)/\L\1/'
Plusieurs réponses ont noté l'utilisation de \L
. Pourtant, \E
vaut également la peine de savoir si vous utilisez \L
.
\L
convertit tout au suivant\U
ou\E
en minuscules. ...\E
désactive la conversion de casse.(Source: https://www.regular-expressions.info/replacecase.html )
Supposons donc que vous vouliez utiliser rename
pour mettre en minuscule une partie de certains noms de fichiers comme celui-ci:
artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
vous pourriez faire quelque chose comme:
rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
En Perl, il y a
$string =~ tr/[A-Z]/[a-z]/;
La plupart des implémentations Regex vous permettent de passer une fonction de rappel lors d'un remplacement, vous pouvez donc simplement renvoyer une version en minuscule de la correspondance à partir du rappel.