Answers:
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
使用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
Pure Bash 4.x,使用正则表达式选择要大写的部分,以及该^^
部分的大写运算符。前后粘贴(与。*匹配)以重新创建整个字符串:
foo=syslog_apr_24_30
if [[ $foo =~ (.*)(_[a-z])(.*) ]]; then
foo=${BASH_REMATCH[1]}${BASH_REMATCH[2]^^}${BASH_REMATCH[3]}
fi
如果您不记得所有的引用规则,则可以安全地引用除正则表达式以外的所有内容(这将使=~
文字字符串匹配)。
所述^
upcase-第一操作员仅工作在一个变量(或数组元素)的开始。而且似乎没有任何子字符串扩展可以为您提供perl所谓的左值(您可以分配/修改)。大写/小写优先的运算符可以采用按字符匹配的模式,但这无助于跳过syslog_
,因为在“ syslog”中有以字母开头的月份名称。
无论如何,这可能比foo="$(echo "$foo" | sed 's/_./\U&/')"
(格伦·杰克曼(Glenn Jackman)发表的对已接受答案的评论)要快。
Bash,sed或awk比perl快许多倍。如果您开始发现在shell脚本中有用的多个perl单行代码,则应该将整个内容写在perl中。
sed 's/_./\U&/'