シェルスクリプト中に変換したいことがあったのでちょっと書いてみました。
ちなみに、CamelCase などの言葉はこんな感じです。
- キャメルケース(Camel Case)
- 最初の1単語は小文字、残りは先頭大文字で区切る。Javaなどの変数名で使う。
- e.g.
camelCaseString
- パスカルケース(Pascal Case)
- キャメルケースの最初の一文字が大文字。クラス名などで使う。
- e.g.
PascalCaseString
- スネークケース(Snake Case)
- すべて小文字で単語の区切りがアンダースコア (
_
) - e.g.
snake_case_string
- すべて小文字で単語の区切りがアンダースコア (
- ケバブケース(Kebab Case)
- すべて小文字で単語の区切りがハイフン (
-
) - e.g.
kebab-case-string
- すべて小文字で単語の区切りがハイフン (
ケバブケースは調べてて初めて名前を知。
前提条件
Macユーザーなので、 sed は BSD のものを使っています。
GNU sed の場合は読み替えてください。
Camel(Pascal) to Snake(Kebab)
- 大文字区切りを見つけてアンダースコア(またはハイフン)を挿入
- 英字をすべて小文字に変換
sed -E 's/(.)([A-Z])/\1_\2/g' | tr '[A-Z]' '[a-z]'
ポイント: 大文字を検出する場所はその前に少なくとも1文字以上あることを条件にしているので、パスカルケースの場合の1文字目は対象外になる
Snake(Kebab) to Pascal
awk
の区切り文字をアンダースコア(またはハイフン)にして各フィールドごとに先頭を大文字にする
awk -F '_' '{ for(i=1; i<=NF; i++) {printf toupper(substr($i,1,1)) substr($i,2)}} END {print ""}'
Snake(Kebab) to Camel
パスカルケースへの変換とほぼ同様だが、2単語目から大文字化する。
awk -F '_' '{ printf $1; for(i=2; i<=NF; i++) {printf toupper(substr($i,1,1)) substr($i,2)}} END {print ""}'