Question Comment convertir une chaîne en minuscule dans Bash?


Y a-t-il un moyen de  convertir une chaîne en une chaîne minuscule?

Par exemple, si j'ai:

a="Hi all"

Je veux le convertir en:

"hi all"

913
2018-02-15 07:02


origine


Réponses:


Les sont de différentes manières:

tr

$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all

AWK

$ echo "$a" | awk '{print tolower($0)}'
hi all

Bash 4.0

$ echo "${a,,}"
hi all

sed

$ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all

Perl

$ echo "$a" | perl -ne 'print lc'
hi all

Frapper

lc(){
    case "$1" in
        [A-Z])
        n=$(printf "%d" "'$1")
        n=$((n+32))
        printf \\$(printf "%o" "$n")
        ;;
        *)
        printf "%s" "$1"
        ;;
    esac
}
word="I Love Bash"
for((i=0;i<${#word};i++))
do
    ch="${word:$i:1}"
    lc "$ch"
done

1581
2018-02-15 07:43



Dans Bash 4:

En minuscule

$ string="A FEW WORDS"
$ echo "${string,}"
a FEW WORDS
$ echo "${string,,}"
a few words
$ echo "${string,,[AEIUO]}"
a FeW WoRDS

$ string="A Few Words"
$ declare -l string
$ string=$string; echo "$string"
a few words

En majuscules

$ string="a few words"
$ echo "${string^}"
A few words
$ echo "${string^^}"
A FEW WORDS
$ echo "${string^^[aeiou]}"
A fEw wOrds

$ string="A Few Words"
$ declare -u string
$ string=$string; echo "$string"
A FEW WORDS

Toggle (non documenté, mais facultativement configurable au moment de la compilation)

$ string="A Few Words"
$ echo "${string~~}"
a fEW wORDS
$ string="A FEW WORDS"
$ echo "${string~}"
a FEW WORDS
$ string="a few words"
$ echo "${string~}"
A few words

Capitalisation (non documenté, mais facultativement configurable au moment de la compilation)

$ string="a few words"
$ declare -c string
$ string=$string
$ echo "$string"
A few words

Cas du titre:

$ string="a few words"
$ string=($string)
$ string="${string[@]^}"
$ echo "$string"
A Few Words

$ declare -c string
$ string=(a few words)
$ echo "${string[@]}"
A Few Words

$ string="a FeW WOrdS"
$ string=${string,,}
$ string=${string~}
$ echo "$string"
A few words

Pour désactiver un declare attribut, utilisation +. Par exemple, declare +c string. Cela affecte les affectations suivantes et non la valeur actuelle.

le declare les options modifient l'attribut de la variable, mais pas le contenu. Les réaffectations dans mes exemples mettent à jour le contenu pour montrer les changements.

Modifier:

Ajouté "bascule premier caractère par mot" (${var~}) comme suggéré par ghostdog74.

Modifier: Comportement du tilde corrigé pour correspondre à Bash 4.3.


350
2018-02-15 10:31



echo "Hi All" | tr "[:upper:]" "[:lower:]"

108
2018-02-15 07:13



tr:

a="$(tr [A-Z] [a-z] <<< "$a")"

AWK:

{ print tolower($0) }

sed:

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

70
2018-02-15 07:03



Je sais que c'est un post oldish mais j'ai fait cette réponse pour un autre site alors j'ai pensé que je le posterais ici:

UPPER -> inférieur: utilisez python:

b=`echo "print '$a'.lower()" | python`

Ou Ruby:

b=`echo "print '$a'.downcase" | ruby`

Ou Perl (probablement mon préféré):

b=`perl -e "print lc('$a');"`

Ou PHP:

b=`php -r "print strtolower('$a');"`

Ou Awk:

b=`echo "$a" | awk '{ print tolower($1) }'`

Ou Sed:

b=`echo "$a" | sed 's/./\L&/g'`

Ou Bash 4:

b=${a,,}

Ou NodeJS si vous l'avez (et sont un peu fous ...):

b=`echo "console.log('$a'.toLowerCase());" | node`

Vous pouvez également utiliser dd (mais je ne le ferais pas!):

b=`echo "$a" | dd  conv=lcase 2> /dev/null`

inférieur -> UPPER:

utilisez python:

b=`echo "print '$a'.upper()" | python`

Ou Ruby:

b=`echo "print '$a'.upcase" | ruby`

Ou Perl (probablement mon préféré):

b=`perl -e "print uc('$a');"`

Ou PHP:

b=`php -r "print strtoupper('$a');"`

Ou Awk:

b=`echo "$a" | awk '{ print toupper($1) }'`

Ou Sed:

b=`echo "$a" | sed 's/./\U&/g'`

Ou Bash 4:

b=${a^^}

Ou NodeJS si vous l'avez (et sont un peu fous ...):

b=`echo "console.log('$a'.toUpperCase());" | node`

Vous pouvez également utiliser dd (mais je ne le ferais pas!):

b=`echo "$a" | dd  conv=ucase 2> /dev/null`

Aussi, quand vous dites «shell», je suppose que vous voulez dire bash mais si vous pouvez utiliser zsh c'est aussi simple que

b=$a:l

pour les minuscules et

b=$a:u

pour les majuscules.


35
2018-05-14 09:36



Dans zsh:

echo $a:u

Je dois aimer zsh!


25
2018-01-27 05:37



Utiliser GNU sed:

sed 's/.*/\L&/'

Exemple:

$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string

16
2017-09-26 15:45



Pour un shell standard (sans bashisms) utilisant uniquement des builtins:

uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
lowers=abcdefghijklmnopqrstuvwxyz

lc(){ #usage: lc "SOME STRING" -> "some string"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $uppers in
            *$CUR*)CUR=${uppers%$CUR*};OUTPUT="${OUTPUT}${lowers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

Et pour les majuscules:

uc(){ #usage: uc "some string" -> "SOME STRING"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $lowers in
            *$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

11
2018-01-21 10:27



Pré Bash 4.0

Bash Abaisse le cas d'une chaîne et affecte une variable

VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]') 

echo "$VARIABLE"

10
2018-01-24 13:53



Expression régulière

Je voudrais prendre le crédit pour la commande que je souhaite partager mais la vérité est que je l'ai obtenue pour mon propre usage de http://commandlinefu.com. Il a l'avantage que si vous cd à n'importe quel répertoire dans votre propre dossier de base qui est il va changer tous les fichiers et dossiers en minuscules récursive s'il vous plaît utiliser avec prudence. C'est une solution de ligne de commande brillante et particulièrement utile pour les multitudes d'albums que vous avez stockés sur votre disque.

find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

Vous pouvez spécifier un répertoire à la place du point (.) Après la recherche qui indique le répertoire actuel ou le chemin complet.

J'espère que cette solution s'avère utile. La seule chose que cette commande ne fait pas, c'est de remplacer les espaces par des traits de soulignement - eh bien une autre fois peut-être.


7
2017-08-21 10:21



En bash 4 vous pouvez utiliser le typage

Exemple:

A="HELLO WORLD"
typeset -l A=$A

7
2018-03-23 06:48