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

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

tr コマンドを使う方法

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

全文を変換

1
2
3
4
5
6
7
# 大文字→小文字
$ echo 'Hello World!' | tr '[:upper:]' '[:lower:]'
hello world!

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

一部変換

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

sed コマンドを使う方法

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

全文を変換

1
2
3
4
5
6
7
# 大文字→小文字
$ echo 'Hello World!' | sed 's/.\+/\L\0/'
hello world!

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

一部を変換

最初の単語のみに適用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 大文字→小文字
$ 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 ループと組み合わせて使う場合に便利です。

全文を変換

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

1
2
3
4
5
6
7
# 大文字→小文字
$ X='Hello World!'; echo "${X,,}"
hello world!

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

先頭 1 文字を変換

先頭一文字だけを変換する事もできます。

1
2
3
4
5
6
7
# 大文字→小文字
$ X='HELLO'; echo "${X,}"
hELLO

# 小文字→大文字
$ X='world'; echo "${X^}"
World

一部を変換

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

1
2
3
4
5
6
7
# 大文字→小文字
$ read S1 SN <<<$(echo 'Hello World!'); echo "${S1,,} $SN"
hello World!

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

awk を使う

awk を使ってもできます。

1
2
3
4
5
6
7
# 大文字→小文字
$ echo  'Hello World!' | awk '{print tolower($0)}'
hello world!

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

ひとこと

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