8

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

  • getEmployee_NamegetEmployeeName
  • us_employee_nameusEmployeeName

如果我们有id并且我们想将两者都大写怎么办ID,如

  • us_employee_idusEmployeeID?

因为我还在学习,所以我还没有尝试过任何东西。我可以做类似s/_/\U\1/g的事情sed还是可以使用一些脚本来做到这一点?

4

4 回答 4

10

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

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

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

于 2013-06-27T01:48:22.327 回答
1

Perl 脚本:

use String::CamelCase qw(camelize);

while (<>) {
  print camelize($_);
}
于 2013-06-27T01:05:35.077 回答
1

awk 稍微详细一点,但它适用于所有 gnu/非 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
于 2013-06-27T06:20:08.290 回答
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__
于 2013-12-05T13:49:59.160 回答