Supprimer le trait de soulignement et mettre en majuscule le caractère qui suit

Je me demandais si il y avait un moyen de remplacer chaque trait de soulignement dans chaque fichier dans un dossier (par exemple des fichiers .java) et de convertir le caractère suivant en majuscule, comme

  • getEmployee_NamegetEmployeeName
  • us_employee_nameusEmployeeName

Et si nous avions id et nous voulions capitaliser à la fois I et D , comme dans

  • us_employee_idusEmployeeID ?

Je n’ai encore rien essayé depuis que j’apprends encore. Puis-je faire quelque chose comme s/_/\U\1/g dans sed ou puis-je utiliser un script pour le faire?

Votre suggestion 's/_/\U\1/g' est très proche. Si vous avez le GNU sed, alors ce qui suit devrait fonctionner:

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

(Je le devrais , parce que ce que vous souhaitez n’est pas toujours ce que vous voulez.)

Script Perl:

 use Ssortingng::CamelCase qw(camelize); while (<>) { print camelize($_); } 

Peu plus verbeux de awk mais ça marchera sur toutes les versions Unix gnu / non-gnu:

 > 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 

Vous pouvez essayer le script bash suivant:

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

r.awk est

 { 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) } 

Fichier d’entrée donné file1.java

 getEmployee_Name getEmployee_Name us_employee_id us_employee_id asdf_asdf__ 

nous obtenons de awk -f r.awk file1.java :

 getEmployeeName getEmployeeName usEmployeeID usEmployeeID asdfAsdf__