1. ホーム
  2. string

[解決済み] Bashで文字列を小文字に変換する方法は?

2022-03-19 18:11:42

質問

での方法はありますか? バッシュ を小文字の文字列に変換することはできますか?

例えば、私が持っている場合。

a="Hi all"

に変換したい。

"hi all"

解決方法は?

いろいろな方法があります。

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

セッド

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

パール

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

バッシュ

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 version 4.2.46 と 4.0.33 (and same behaviour 2.05b.0 but nocasematch is not implemented))、以下のように使ってもうまくいきません。 shopt -u nocasematch; . nocasematchの設定を解除すると、[[ "fooBaR" == "FOObar" ]]はOKになりますが、大文字小文字が[b-z]と[A-Z]で間違ってマッチしてしまうという奇妙な現象が発生します。Bashはダブルネガティブ("nocasematch"の設定を解除)で混乱しているのです! :-)