답변:
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
사용 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 우선 연산자는 변수 (또는 배열 요소)의 시작 부분에서 작동한다. 그리고 펄이 lvalue라고 부르는 것을 제공하는 하위 문자열 확장이없는 것 같습니다 (할당 / 수정 가능). 대문자 / 소문자 우선 연산자는 문자별로 일치하는 패턴을 취할 수 있지만 syslog_
"syslog"에서 문자로 시작하는 월 이름이 있기 때문에 건너 뛰는 데 도움이되지 않습니다 .
어쨌든, 이것은 foo="$(echo "$foo" | sed 's/_./\U&/')"
글렌 잭맨 (Glenn Jackman의 대답에 대한 의견으로 게시 됨) 보다 빠를 수 있습니다 .
배쉬, sed 또는 awk는 perl보다 몇 배 빠릅니다. 쉘 스크립트에서 유용한 여러 개의 perl one-liner를 찾기 시작하면 모든 것을 perl로 작성해야합니다.
sed 's/_./\U&/'