web-dev-qa-db-ja.com

ファイルをキャメルケースからアンダースコアに変換するAwk / sedスクリプト

プロジェクト内のいくつかのファイルをcamelCaseからunderscore_caseに変換したいと思います。

ファイル名だけが機能するオンライン業者が欲しいのですが。

13

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
22
Avinash Raj

提案された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
5
pachopepe

何度か失敗した後、私はこれを手に入れました(読みやすくするために数行で書きましたが、改行を削除してオンラインにすることができます):

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

それが誰かを助けることができることを願っています!

4

これはあなたが望むものかもしれません:

$ 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

しかし、サンプル入力と期待される出力がなければ、それは単なる推測です。

3
Ed Morton