web-dev-qa-db-fra.com

Supprimer tous les caractères spéciaux et la casse de la chaîne dans bash

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?

22
Questionmark
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.

34
Dan Bliss

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
12
gniourf_gniourf

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.

7
Unwastable

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
6
luka5z