sed y 명령을 사용하여 로케일 독립적인 대문자화 또는 대문자화 취소

sed y 명령을 사용하여 로케일 독립적인 대문자화 또는 대문자화 취소

나는 대문자를 사용하거나 대문자로 사용하지 않는 가장 좋은(예: 로케일 독립적) 방법을 찾고 있습니다 sed.

나는 이것이 에 의해 이루어질 수 있다는 것을 깨달았습니다 tr. 하지만 더 큰 sed 스크립트의 일부로 자본을 제거하고 특정 줄에 대해서만 수행하고 싶습니다.

실제로 이 솔루션은 tr내 컴퓨터에서 악센트 문자를 무시하는 것 같습니다!

<commands> | tr '[:lower:]' '[:upper:]'

나는 y 명령을 sed사용하여 한 문자 집합을 다른 문자 집합으로 바꿀 수 있다는 것을 알고 있습니다. 이는 문자열을 대문자로 표시하거나 대문자로 표시하지 않는 데 사용할 수 있습니다.

그러나 이는 순진한 접근 방식이 될 것입니다.

<commands> | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'

악센트 문자를 고려하지 않기 때문입니다.

물론 양쪽에 악센트가 있는 문자를 모두 포함할 수도 있지만 더 좋은 방법이 있을 것 같습니다.

나는 이와 같은 동등 클래스를 알고 있는데 [=e=], 이 경우 "e"의 모든 변형과 일치합니다. 하지만 y 명령과 함께 사용할 수 없는 것 같습니다. 적어도 제가 원하는 방식은 아닙니다.

<commands> | sed 'y/[=a=]bcd[=e=]/[=A=]BCD[=E=]/'

sed는 위 사항에 대해 불평하지 않지만 작동하지 않습니다.

나는 또한 동일한 (부족한) 결과로 이것을 시도했습니다.

<commands> | sed 'y/[a-z]/[A-Z]/'

내가 만날 수 있는 모든 캐릭터를 나열하는 것 외에 내가 하고 싶은 일을 할 수 있는 방법이 있나요?

답변1

GNU에서sed 문서, y 명령을 사용하려면 소스 문자의 길이가 대상 문자의 길이와 정확히 일치해야 합니다. 왼쪽이나 오른쪽 모두 정규식으로 간주되지 않습니다.

다음을 수행하십시오

echo 'forté' | sed 'y/[[:lower:]]/[[:upper:]]/'

주다

fprté

보시다시피 소스 문자는 정규식이 아닌 문자 묶음으로 처리됩니다.

따라서 만날 수 있는 모든 문자를 나열하는 것이 y 명령의 유일한 옵션인 것처럼 보입니다.

하지만 GNU sed를 사용한다면 "s" 명령을 사용하는 또 다른 방법이 있습니다!

echo 'forté' | sed 's/[[:lower:]]/\u&/g'
echo 'FORTÉ' | sed 's/[[:upper:]]/\l&/g'

[[:lower:]][[:upper:]]변경해야 하는 모든 문자 와 일치합니다. \u그리고 \l변경하세요. 그리고 g해당 행의 모든 ​​이벤트에 대해 이러한 일이 발생하는지 확인하세요.

관련 정보