【问题标题】:Remove underscore and capitalize character after it删除下划线并在其后大写字符
【发布时间】:2013-06-24 07:36:18
【问题描述】:

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

  • getEmployee_NamegetEmployeeName
  • us_employee_nameusEmployeeName

如果我们有id 并且我们想将ID 都大写,就像

  • us_employee_idusEmployeeID?

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

【问题讨论】:

标签: unix command-line replace sed awk


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,Joseph 的解决方案不适用于 sed 在 MacOS 上的默认实现。我可以通过登录 CentOS 机器并在那里运行来解决这个问题。
【解决方案2】:

Perl 脚本:

use String::CamelCase qw(camelize);

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

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

    • 只对第一个下划线有效,然后去掉其余的。 OP(和我)正在寻找可以替代它们的东西。
    • @Ryan:我已经更新了我的答案,现在可以使用任意数量的下划线。请检查。
    【解决方案4】:

    您可以尝试以下 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__
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2021-02-15
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      相关资源
      最近更新 更多