J'écris un script bash qui doit analyser les noms de fichiers.
Il devra supprimer tous les caractères spéciaux (y compris l'espace): "!?.-_ et changer toutes les lettres majuscules en minuscules. Quelque chose comme ceci:
Some_randoM data1-A
More Data0
à:
somerandomdata1a
moredata0
J'ai vu beaucoup de questions pour le faire dans de nombreux langages de programmation différents, mais pas dans bash. Y at-il un bon moyen de le faire?
cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'
Le premier tr
supprime les caractères spéciaux. d
signifie supprimer, c
signifie complément (inverser le jeu de caractères). Alors, -dc
signifie supprimer tous les caractères sauf ceux spécifiés. Le \n
et \r
sont inclus pour conserver les nouvelles lignes de style Linux ou Windows, ce que je suppose que vous voulez.
Le second traduit les majuscules en minuscules.
Solution Pure BASH 4+:
$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo "$f"
SomerandoMdata1A
$ echo "${f,,}"
somerandomdata1a
Une fonction pour cela:
clean() {
local a=${1//[^[:alnum:]]/}
echo "${a,,}"
}
Essayez-le:
$ clean "More Data0"
moredata0
si vous utilisez l'approche mkelement0 et Dan Bliss. Vous pouvez également examiner l'expression régulière sed + POSIX.
cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'
Sed correspond à tous les autres caractères qui ne figurent pas entre crochets, à l'exception des lettres et des chiffres, et supprimez-les.
J'ai utilisé tr
pour supprimer tous les caractères qui ne font pas partie de [:print:]
classe
cat file.txt | tr -dc '[:print:]'
ou
echo "..." | tr -dc '[:print:]'
De plus, vous voudrez peut-être |
(diriger) la sortie vers od -c
pour confirmer le résultat
cat file.txt | tr -dc '[:print:]' | od -c