Bashシェルスクリプトで大文字小文字の変換方法いろいろ

Bash, CentOS, Cygwin, Linux, Ubuntu

前回大文字あるいは小文字専用の変数を作成する方法について触れたので、
文字列の大文字<=>小文字の変換方法について紹介します。

tr コマンドを使う方法

おそらく最も古典的かつベーシックな方法です。

全文を変換

# 大文字→小文字
$ echo 'Hello World!' | tr '[:upper:]' '[:lower:]'
hello world!
# 小文字→大文字
$ echo 'Hello World!' | tr '[:lower:]' '[:upper:]'
HELLO WORLD!

一部変換

おそらく tr を使う方法ではできないのでは?

sed コマンドを使う方法

こちらも比較的よく見る方法です。
ポイントは \L\U
置換したい文字列を指定する箇所の先頭に付与すると、 L の場合には小文字に、 U の場合には大文字に変換されます。

全文を変換

# 大文字→小文字
$ echo 'Hello World!' | sed 's/.\+/\L\0/'
hello world!
# 小文字→大文字
$ echo 'Hello World!' | sed 's/.\+/\U\0/'
HELLO WORLD!

一部を変換

最初の単語のみに適用。

# 大文字→小文字
$ echo 'Hello World!' | sed 's/^\(\w\+\)\+/\L\1/'
hello world!
## 見にくい場合は拡張正規表現オプションを付けるとよい
$ echo 'Hello World!' | sed -E 's/^(\w+)+/\U\1/'
hello World!
# 小文字→大文字
$ echo 'Hello World!' | sed 's/^\(\w\+\)\+/\U\1/'
HELLO World!
## 見にくい場合は拡張正規表現オプションを付けるとよい
$ echo 'Hello World!' | sed -E 's/^(\w+)+/\U\1/'
HELLO World!

Bashの変数の組み込み機能を使う

Bash 4.0以降では、構文として変数の値参照時に大文字<=>小文字の変換が可能です。
デメリットは変数として使うため、一度代入しておかないといけないこと。
while read ループと組み合わせて使う場合に便利です。

全文を変換

変数の参照時にオプションを指定します。
意外と覚えやすい。 ,, は下を向いているので小文字に変換され、 ^^ は上を向いているので大文字に変換されます。

# 大文字→小文字
$ X='Hello World!'; echo "${X,,}"
hello world!
# 小文字→大文字
$ X='Hello World!'; echo "${X^^}"
HELLO WORLD!

一部を変換

read との組み合わせになるかな。
読みにくい。。

# 大文字→小文字
$ read S1 SN <<<$(echo 'Hello World!'); echo "${S1,,} $SN"
hello World!
# 小文字→大文字
$ read S1 SN <<<$(echo 'Hello World!'); echo "${S1^^} $SN"
HELLO World!

awk を使う

awk を使ってもできます。

# 大文字→小文字
$ echo  'Hello World!' | awk '{print tolower($0)}'
hello world!
# 小文字→大文字
$ echo  'Hello World!' | awk '{print toupper($0)}'
HELLO WORLD!

ひとこと

個人的には sed の方法が汎用的で好きです。

Bash, CentOS, Cygwin, Linux, Ubuntu

Posted by genzouw