특정 문자열에서 한 문자만 대문자/소문자로 바꾸는 방법이 있습니까?
입력 예:
syslog_apr_24_30
syslog_mar_01_17
원하는 출력:
syslog_Apr_24_30
syslog_Mar_01_17
월 초의 대문자를 참고하세요.
시도해 보았 awk
으나 작동시킬 만큼 실력이 좋지 않습니다.
답변1
\u
다음을 사용하여 GNU sed에서 문자를 대문자로 표시 할 수 있습니다 .
sed -e 's/_\(.\)/_\u\1/' input
Perl도 같은 일을 합니다:
perl -pe 's/_(.)/_\u$1/' input
\l
그 반대가 사실입니다.
답변2
Awk
하위 문자열과 추가 기능이 포함된 버전
awk 'BEGIN{ FS=OFS="_"} {
cap=toupper(substr($2,1,1));
lower=substr($2,2,3);
$2 = cap lower; print
}' list.txt
실행 예시:
$ awk 'BEGIN{ FS=OFS="_"} {
cap=toupper(substr($2,1,1));
lower=substr($2,2,3);$2 = cap lower; print
}' list.txt
syslog_Apr_24_30
syslog_Mar_01_17
답변3
이상한:
echo "syslog_apr_24_30" |
awk -F'_' '{print $1"_"toupper(substr($2,1,1)) substr($2,2) "_"$3"_"$4}'
답변4
사용 awk
:
awk -F_ '{
printf "%s_%s_%s_%s",$1,toupper(substr($2,1,1))substr($2,2,2),$3,$4"\n"
}' foo
또는
awk -F_ '{
for(i=1;i<=NF;i++) {
if(i==2){
printf "%s",toupper(substr($i,1,1))substr($i,2,length($i)-1)
}
else {printf "%s",$i}
if(i<NF) {printf "%s","_"}
} printf "%s","\n"}' foo
예
% cat foo
syslog_apr_24_30
syslog_mar_01_17
% awk -F_ '{for(i=1;i<=NF;i++) {if(i==2){printf "%s",toupper(substr($i,1,1))substr($i,2,length($i)-1)} else {printf "%s",$i} if(i<NF) {printf "%s","_"}} printf "%s","\n"}' foo
syslog_Apr_24_30
syslog_Mar_01_17
% awk -F_ '{printf "%s_%s_%s_%s",$1,toupper(substr($2,1,1))substr($2,2,2),$3,$4"\n"}' foo
syslog_Apr_24_30
syslog_Mar_01_17