プロジェクト内のいくつかのファイルをcamelCase
からunderscore_case
に変換したいと思います。
ファイル名だけが機能するオンライン業者が欲しいのですが。
Sedも使用できます。
$ echo 'fooBar' | sed -r 's/([a-z0-9])([A-Z])/\1_\L\2/g'
foo_bar
$ echo 'fooBar' | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\L\2/g'
foo_bar
提案されたsed
回答にはいくつかの問題があります。
$ echo 'FooBarFB' | sed -r 's/([a-z0-9])([A-Z])/\1_\L\2/g'
Foo_bar_fB
私は次のことを推測します
$ echo 'FooBarFB' | sed -r 's/([A-Z])/_\L\1/g' | sed 's/^_//'
foo_bar_f_b
何度か失敗した後、私はこれを手に入れました(読みやすくするために数行で書きましたが、改行を削除してオンラインにすることができます):
awk -i inplace '{
while ( match($0, /(.*)([a-z0-9])([A-Z])(.*)/, cap))
$0 = cap[1] cap[2] "_" tolower(cap[3]) cap[4];
print
}' FILE
完全を期すために、逆のことをするように適応させることができます(CamelCaseにアンダースコアを付けます):
awk -i inplace '{
while ( match($0, /(.*)([a-z0-9])_([a-z])(.*)/, cap))
$0 = cap[1] cap[2] toupper(cap[3]) cap[4];
print
}' FILE
ご参考までに、-i inplace
はawk> = 4.1.0でのみ使用可能なフラグであり、ファイルをインプレースで変更します(sed -i
と同様)。 awkバージョンが古い場合は、次のような操作を行う必要があります。
awk '{...}' FILE > FILE.tmp && mv FILE.tmp FILE
それが誰かを助けることができることを願っています!
これはあなたが望むものかもしれません:
$ cat tst.awk
{
head = ""
tail = $0
while ( match(tail,/[[:upper:]]/) ) {
tgt = substr(tail,RSTART,1)
if ( substr(tail,RSTART-1,1) ~ /[[:lower:]]/ ) {
tgt = "_" tolower(tgt)
}
head = head substr(tail,1,RSTART-1) tgt
tail = substr(tail,RSTART+1)
}
print head tail
}
$ cat file
nowIs theWinterOfOur disContent
From ThePlay About RichardIII
$ awk -f tst.awk file
now_is the_winter_of_our dis_content
From The_play About Richard_iII
しかし、サンプル入力と期待される出力がなければ、それは単なる推測です。