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带有子字符串和 toupper 的版本

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

awk:

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

相关内容