删除下划线并在其后大写字符

时间:2013-06-26 23:53:19

标签: unix command-line replace sed awk

我只是想知道是否有办法替换文件夹中每个文件中的每个下划线(比如.java文件)并将下一个字符转换为大写,例如

  • getEmployee_NamegetEmployeeName
  • us_employee_nameusEmployeeName

如果我们有id并且我们希望将ID都大写,那么该怎么做,如

  • us_employee_idusEmployeeID

我还没学过任何东西,因为我还在学习。我可以在s/_/\U\1/g中执行类似sed的操作,还是可以使用某些脚本执行此操作?

4 个答案:

答案 0 :(得分:8)

您的建议's/_/\U\1/g'非常接近。如果你有GNU sed,那么下面的应该工作:

sed 's/_\(.\)/\U\1/g'

(我说应该,因为你想要的并不总是你想要的。)

答案 1 :(得分:1)

Perl脚本:

use String::CamelCase qw(camelize);

while (<>) {
  print camelize($_);
}

答案 2 :(得分:1)

来自awk的更多详细信息,但它适用于所有gnu / non-gnu Unix风格:

> s='get_employee_Name'
> awk -F _ '{printf "%s", $1; for(i=2; i<=NF; i++) printf "%s", toupper(substr($i,1,1)) substr($i, 2); print"";}' <<< "$s"
getEmployeeName

答案 3 :(得分:0)

您可以尝试以下bash脚本:

#! /bin/bash
files=(*.java)
for ((i=0; i<=${#files[@]}; i++ )) ; do
    file="${files[$i]}"
    awk -f r.awk "$file" > "${file}.mod"
done

其中r.awk

{
    str=$0
    mstr=""
    while(match(str,/_([[:alnum:]])/,a)) {
        q=substr(str,RSTART+RLENGTH,2)
        chr=a[1]
        pos=RSTART+RLENGTH
        pos2=RSTART-1
        if (length(q)==1) {
            if (match(q,/[[:alnum:]]/)) {
                chr=chr q
                pos=pos+1
            }
        }
        else if (length(q)==2) {
            if (match(q,/[[:alnum:]][[:blank:]]/)) {
                pos=pos+1
                chr=chr substr(q,1,1)
            }
        }
        mstr=(mstr substr(str,1,pos2) toupper(chr))
        str=substr(str,pos)
    }
    print (mstr str)
}

给定输入文件file1.java

getEmployee_Name getEmployee_Name
us_employee_id
    us_employee_id
asdf_asdf__

我们来自awk -f r.awk file1.java

getEmployeeName getEmployeeName
usEmployeeID
    usEmployeeID
asdfAsdf__