파일 확장자를 제외하고 각 점/마침표 뒤의 첫 글자를 대문자로 표시하기 위해 Mac Bash에서 파일 이름을 변경하고 싶습니다.
- 입력 문자열 예:
one.two.three.four.txt
- 원하는 출력:
One.Two.Three.Four.txt
나는 다음을 시도했다:
echo 'one.two.three.four.txt' | awk 'BEGIN{FS=OFS="."} NF==1{$1=toupper($1)} {for (i=1;i<NF;i++) $i=toupper($i)} 1'
그러나 결과는 다음과 같습니다.
ONE.TWO.THREE.FOUR.txt
따라서 확장자를 제외한 모든 항목을 대문자로 만듭니다.
첫 글자는 대문자로, 확장자는 소문자로 찾고 있어요.
awk
Mac Bash에서 as를 사용하여 솔루션을 찾는 것이 sed \U
작동하지 않습니다(지금까지는 작동하지 않았습니다).
미리 감사드립니다
답변1
시도를 변형하여 다음을 수행해야 합니다.
echo "one.two.three.four.txt" |
awk 'BEGIN{FS=OFS="."} {for (i=1;i<NF;i++) {$i=toupper(substr($i,1,1)) substr($i,2)}}1'
그러면 입력 및 출력 필드 구분 기호가 다시 로 설정됩니다 .
.
그런 다음 마지막 필드를 제외한 모든 필드를 반복하고 각 필드를 첫 번째 문자의 대문자 버전( substr()
격리하는 함수 사용)과 나머지 원본 콘텐츠(다시 substr()
함수 사용)로 재조립합니다.
마지막으로 모든 수정 사항을 포함하여 현재 줄을 인쇄합니다(이것은 1
규칙 블록 외부에서 "방황"하는 것처럼 보입니다).
부록: 댓글에서 지적했듯이 OP는 실제로 초기 자본뿐만 아니라 성숙 자본 확보를 원합니다.수도- 분리된 .
부분, 즉 이후의 모든 문자도 소문자로 강제합니다. 이는 위 절차를 약간 수정하여 달성할 수 있습니다.
echo "one.two.tHREE.four.txt" |
awk 'BEGIN{FS=OFS="."} {for (i=1;i<NF;i++) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}}1'
답변2
또 다른 Perl 솔루션은 간단한 정규식을 사용하는 것입니다.
echo "one-one.two_two.three.four.txt"|perl -pe 's/([\w-]+\.)/ucfirst($1)/ge'
One-one.Two_two.Three.Four.txt
이것은 점 문자로 구분된 단어 문자 집합을 찾기 위해 iterate()를 수행합니다 \g
. 이 클래스에서 유효한 문자 라는 자동 힌트를 -
사용하세요 . 그러면 각 그룹의 첫 번째 문자( )가 소문자로 평가됩니다.\w
_
\e
답변3
대신 Perl을 사용할 수 있습니다.
$ echo "one.two.three.four.txt" |
perl -F'\.' -lane 'print join ".", map{ucfirst}(@F);'
One.Two.Three.Four.Txt
확장자의 첫 글자도 대문자로 사용하지 않으려면 마지막 .
으로 구분된 요소를 건너뛸 수 있습니다.
$ echo "one.two.three.four.txt" |
perl -F'\.' -lane 'print join( ".", map{ucfirst}(@F[0..$#F-1])) . ".$F[$#F]"'
One.Two.Three.Four.txt
답변4
그런 다음 GNU sed를 설치하십시오.
$ echo 'one.two.three.four.txt' | sed -E 's/([^.])([^.]*\.)/\u\1\2/g'
One.Two.Three.Four.txt