Как преобразовать строку в нижний регистр в Bash? - PullRequest
1083 голосов
/ 15 февраля 2010

Есть ли в способ преобразовать строку в строчную?

Например, если у меня есть:

a="Hi all"

Я хочу преобразовать его в:

"hi all"

Ответы [ 20 ]

1890 голосов
/ 15 февраля 2010

Существуют различные способы:

Стандарт POSIX

тр

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

AWK

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

Non-POSIX

Вы можете столкнуться с проблемами переносимости в следующих примерах:

Bash 4.0

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

СЭД

$ 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

Bash

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

Примечание: YMMV на этом. У меня не работает (GNU bash версии 4.2.46 и 4.0.33 (и то же поведение 2.05b.0, но nocasematch не реализовано)) даже с использованием shopt -u nocasematch;. Отключение этого nocasematch приводит к тому, что [["fooBaR" == "FOObar"]] совпадает с ОК, но внутри случая странным образом [b-z] неправильно соответствуют [A-Z]. Bash сбит с толку двойным негативом («unsetting nocasematch»)! : -)

398 голосов
/ 15 февраля 2010

В Баш 4:

в нижний регистр

$ 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

в верхний регистр

$ 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

Переключение (недокументированное, но при желании настраивается во время компиляции)

$ 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

Использование заглавных букв (недокументированное, но при желании настраивается во время компиляции)

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

Заголовок дела:

$ 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

Чтобы отключить атрибут declare, используйте +. Например, declare +c string. Это влияет на последующие назначения, а не на текущее значение.

Опции declare изменяют атрибут переменной, но не ее содержимое. Переназначения в моих примерах обновляют содержимое для отображения изменений.

Edit:

Добавлено «переключение первого символа по слову» (${var~}) в соответствии с предложением ghostdog74 .

Редактировать: Исправлено поведение тильды в соответствии с Bash 4.3.

118 голосов
/ 15 февраля 2010
echo "Hi All" | tr "[:upper:]" "[:lower:]"
74 голосов
/ 15 февраля 2010

тр

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

AWK

{ print tolower($0) }

1012 * СЭД *:

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
41 голосов
/ 14 мая 2014

Я знаю, что это старое сообщение, но я сделал этот ответ для другого сайта, поэтому я решил опубликовать его здесь:

Вверх -> ниже : использовать питон:

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

Или Рубин:

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

Или Perl (вероятно, мой любимый):

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

Или PHP:

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

Или Awk:

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

Или Sed:

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

Или Bash 4:

b=${a,,}

Или NodeJS, если он у вас есть (и немного чокнутый ...):

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

Вы также можете использовать dd (но я бы не стал!):

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

ниже -> UPPER :

использовать Python:

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

Или Рубин:

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

Или Perl (вероятно, мой любимый):

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

Или PHP:

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

Или Awk:

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

Или Sed:

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

Или Bash 4:

b=${a^^}

Или NodeJS, если он у вас есть (и немного чокнутый ...):

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

Вы также можете использовать dd (но я бы не стал!):

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

Также, когда вы говорите 'shell', я предполагаю, что вы имеете в виду bash, но если вы можете использовать zsh, это так же просто, как

b=$a:l

для нижнего регистра и

b=$a:u

для верхнего регистра.

28 голосов
/ 27 января 2011

В зш:

echo $a:u

Должен любить Zsh!

17 голосов
/ 26 сентября 2013

Использование GNU sed:

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

Пример:

$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string
11 голосов
/ 21 января 2012

Для стандартной оболочки (без ошибок), используя только встроенные функции:

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}"
}

А для верхнего регистра:

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 голосов
/ 21 августа 2013

Pre Bash 4.0

Bash Нижний регистр строки и присвоение переменной

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

echo "$VARIABLE"
8 голосов
/ 21 августа 2013

В bash 4 вы можете использовать typeset

Пример:

A="HELLO WORLD"
typeset -l A=$A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...