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_Name
→ getEmployeeName
us_employee_name
→ usEmployeeName
Et si nous avions id
et nous voulions capitaliser à la fois I
et D
, comme dans
us_employee_id
→ usEmployeeID
? 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
où 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__