sedを使ってキャメルケース、スネークケースの相互変換を行う

2019-04-14Bash

はじめに

プロジェクトのソースコードの中のスネークケース文字列をキャメルケース文字列に変換する必要があったので sed で変換できるか試してみました。

検証環境

$ sed --version
sed (GNU sed) 4.2.2

スネークケース から キャメルケース への変換

解説

  1. 全て小文字に変換
  2. _? (アンダースコアと何かの文字)の組合せを探し置換
    • _ (アンダースコア)は除去
    • _ に続く文字を大文字に変換
## テストケース1
$ echo 'xxx_yyy_zzz' | sed -r 's/.*/\L\0/g; s/_([a-z0-9])/\U\1/g;'
xxxYyyZzz

## テストケース2
$ echo 'XXX_YYY_ZZZ' | sed -r 's/.*/\L\0/g; s/_([a-z0-9])/\U\1/g;'
xxxYyyZzz

## テストケース3
$ echo 'xYz' | sed -r 's/.*/\L\0/g; s/_([a-z0-9])/\U\1/g;'
xyz

## テストケース3
$ echo 'XYz' | sed -r 's/.*/\L\0/g; s/_([a-z0-9])/\U\1/g;'
xyz

キャメルケース から スネークケース への変換

解説

  1. 先頭1文字を小文字に変換
  2. 大文字を探し置換
    • _ (アンダースコア)を前に付与
  3. 全て小文字(あるいは大文字)に変換

変換(小文字のみ)

小文字のスネークケースに変換

## テストケース1
$ echo "xxxYyyZzz" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\L\0/g;'
xxx_yyy_zzz

## テストケース2
$ echo "XxxYyyZzz" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\L\0/g;'
xxx_yyy_zzz

## テストケース3
$ echo "XyZ" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\L\0/g;'
xy_z

変換(大文字のみ)

大文字のスネークケースに変換

## テストケース1
$ echo "xxxYyyZzz" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\U\0/g;'
XXX_YYY_ZZZ

## テストケース2
$ echo "XxxYyyZzz" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\U\0/g;'
XXX_YYY_ZZZ

## テストケース3
$ echo "XyZ" | sed -r 's/^./\L\0/; s/([A-Z])/_\1\E/g; s/.*/\U\0/g;'
XY_Z

ひとこと

多くのケースを想定しなければもっとシンプルにかけますが、いろんなケースを考え出すとどんどん複雑になりますね。

2019-04-14Bash