awk / sed脚本将文件从camelCase转换为下划线

时间:2015-03-01 15:44:34

标签: bash awk sed camelcasing

我想将项目中的多个文件从camelCase转换为underscore_case

我想有一个只需要文件名就可以使用的在线人员。

4 个答案:

答案 0 :(得分:17)

你也可以使用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

答案 1 :(得分:4)

经过一些不成功的尝试后,我得到了这个(为了便于阅读,我在几行上写了它,但是我们可以删除新行以获得在线人员):

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

希望它可以帮助别人!

答案 2 :(得分:3)

这可能是你想要的:

$ 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 :(得分:3)

建议的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