我想将项目中的多个文件从camelCase
转换为underscore_case
。
我想有一个只需要文件名就可以使用的在线人员。
答案 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