Как преобразовать строку в нижний регистр в Bash?

для моего приложения, с зашифрованными параметрами URL-адреса GET, только это сработало. Я всегда получал TypeError: $(...) is null. Взято из https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

function previewFile() {
  var preview = document.querySelector('img');
  var file    = document.querySelector('input[type=file]').files[0];
  var reader  = new FileReader();

  reader.addEventListener("load", function () {
    preview.src = reader.result;
  }, false);

  if (file) {
    reader.readAsDataURL(file);
  }
}

Image preview...

1090
задан Ciro Santilli 新疆改造中心996ICU六四事件 9 May 2018 в 16:28
поделиться

5 ответов

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

Стандарт POSIX

tr

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

AWK

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

Не-POSIX

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

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

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"]] соответствует OK, НО внутри регистра, как ни странно, [b-z] неправильно соответствуют [A-Z]. Bash сбивает с толку двойное отрицание ("unsetting nocasematch")! : -)

2044
ответ дан 19 December 2019 в 20:15
поделиться

Простой путь

echo "Hi all" | awk '{ print tolower([110]); }'
0
ответ дан 19 December 2019 в 20:15
поделиться
echo "Hi All" | tr "[:upper:]" "[:lower:]"
120
ответ дан 19 December 2019 в 20:15
поделиться

tr:

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

AWK:

{ print tolower($0) }

sed:

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
76
ответ дан 19 December 2019 в 20:15
поделиться

В Bash 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 + c string . Это влияет на последующие назначения, а не на текущее значение.

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

Правка:

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

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

418
ответ дан 19 December 2019 в 20:15
поделиться