Mac Bash의 마지막 문자를 제외하고 파일 이름에서 분리된 모든 "." 부분의 첫 번째 문자를 대문자로 변환합니다.

Mac Bash의 마지막 문자를 제외하고 파일 이름에서 분리된 모든 "." 부분의 첫 번째 문자를 대문자로 변환합니다.

파일 확장자를 제외하고 각 점/마침표 뒤의 첫 글자를 대문자로 표시하기 위해 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

따라서 확장자를 제외한 모든 항목을 대문자로 만듭니다.

첫 글자는 대문자로, 확장자는 소문자로 찾고 있어요.

awkMac 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

관련 정보