명령줄에서 텍스트 대소문자를 전환하는 이식 가능한 방법이 있습니까?

명령줄에서 텍스트 대소문자를 전환하는 이식 가능한 방법이 있습니까?

POSIX 운영 체제 간에 포팅하고 로케일을 지원하는 방법이 있습니까?변화명령줄의 텍스트 대소문자 구분 - 즉, 소문자를 대문자로 바꾸거나 그 반대로 바꿉니다.

사용암소 비슷한 일종의 영양sed에서는 다음을 사용할 수 있습니다.

echo 'Yes, I Know IT!' | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
yES, i kNOW it!

이는 악센트가 있는 문자와 잘 작동합니다.

echo Élève | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
éLÈVE

\L그러나 GNU 확장을 사용하기 때문에 \U이식성이 없습니다. 반면에 tr내 Linux 시스템에서는 악센트 부호가 있는 문자가 올바르게 처리되지 않습니다.

echo 'Élève' | tr '[:lower:][:upper:]' '[:upper:][:lower:]'
ÉLèVE

해결책이 있나요?

답변1

을(를 ) 수락하면 perl이 솔루션은 다음에서 직접 복사됩니다.Perl, tr 함수를 사용하여 대문자를 소문자로 또는 그 반대로 동시에 변환하시겠습니까?당신을 위해 일할 것입니다 :

echo 'Hello Élève. It is beautiful!' |
    perl -Mopen=locale -Mutf8 -pe 's/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg'

hELLO éLÈVE. iT IS BEAUTIFUL!

( gsed ... || tr ... )또한 GNU가 있는 시스템에서는 gsed우선순위를 가지지만 다른 tr시스템 에서는 그렇지 않도록 비슷한 것을 사용하는지 알고 싶습니다.아마도실행될 GNU가 아닙니다. (GNU POSIX가 아닌 경우 tr분명히 멀티바이트 문자를 올바르게 처리합니다.)

관련 정보