英単語の先頭を大文字に置換する処理をキャピタライズといいますが、このキャピタライズ処理を 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 を仮定しています。
良い子は真似しないで下さいね! (笑