문자열의 문자를 소문자/대문자로 변환하려면 awk 또는 sed를 사용합니까?

문자열의 문자를 소문자/대문자로 변환하려면 awk 또는 sed를 사용합니까?

특정 문자열에서 한 문자만 대문자/소문자로 바꾸는 방법이 있습니까?

입력 예:

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

관련 정보