LoginSignup
11
11

More than 5 years have passed since last update.

shell script でキャピタライズ

Posted at

英単語の先頭を大文字に置換する処理をキャピタライズといいますが、このキャピタライズ処理を unix 標準のコマンドで実装しようという話です。

置換と言えばまず思い浮かぶのが sed (1) なのですが、GNU 拡張された sed (1) の場合は簡単に置換が可能なのですが、私の愛してやまない FreeBSD の標準の sed (1) では簡単にいきません。

GNU sed の場合

$ echo "foo" | sed 's/\(.\)\(.*\)/\U\1\L\2/g'
Foo

GNU 拡張された sed (1) には大文字変換する \U と、小文字変換する \L という演算子があるので大文字、小文字変換が簡単に可能です。

FreeBSD 標準の sed の場合

$ echo "foo" | sed 's/\(.\)\(.*\)/\U\1\L\2/g'
UfLoo

FreeBSD 標準の sed (1) だと正しく変換されません。

awk を利用した場合

sed (1) ではなく awk (1) を利用すれば FreeBSD でも、勿論 Linux でも OS X でもキャピタライズ処理は簡単にできます。

$ echo "foo" | awk '{ print toupper(substr($0, 1, 1)) substr($0, 2, length($0) - 1) }'
Foo

awk (1) には大文字変換関数が実装されているので、切り出した1文字目を大文字変換すれば簡単に実現できます。
GNU 版の sed (1) よりも長くなってしまいますが posix に準拠した機能のみでキャピタライズが可能です。

ここまではワンライナーでそれなりに綺麗に実現可能ですね。

FreeBSD で sed を利用した場合

どうしても FreeBSD の sed (1) を利用したい場合、 tr (1) や exec (1) も併用する事にはなりますが以下の処理で可能です。

$ eval `echo "foo" | sed 's/\(.\)\(.*\)/\/bin\/echo -n \1 | tr "[a-z]" "[A-Z]"; echo \2/g'`
Foo

sed (1) で tr (1) を利用した置換スクリプトを出力して eval (1) で実行した結果を表示するという、もはやネタとしか思えない様なスクリプトです(というか本当にネタです)。
しかも echo -n を利用するために /bin/echo を仮定しています。

良い子は真似しないで下さいね! (笑

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11