tr을 사용하여 대소 문자와 문장 대소 문자를 수정하도록 텍스트를 변경하는 방법은 무엇입니까?

tr을 사용하여 대소 문자와 문장 대소 문자를 수정하도록 텍스트를 변경하는 방법은 무엇입니까?

~에 따르면https://caseconverter.com/

"Capital"은 이렇게 모든 문자를 대문자로 변환합니다.

"소문자"는 아래와 같이 모든 문자를 소문자로 변환합니다.

"올바른 대소문자"는 아래와 같이 각 단어의 첫 글자가 대문자로 표시되도록 텍스트를 변환합니다.

"문장 사례". 이렇게 하면 각 문장의 첫 글자를 대문자로 바꾸고 나머지 텍스트는 소문자로 변환합니다. 따라서 각 마침표 뒤의 첫 글자는 자동으로 대문자로 변환됩니다.

처음 두 가지는 명령을 통해 쉽게 수행할 수 있습니다 tr.

user@linux:~$ tr [:lower:] [:upper:] <<< eXaMPLe
EXAMPLE
user@linux:~$ 

user@linux:~$ tr [:upper:] [:lower:] <<< eXaMPLe
example
user@linux:~$ 

또는

user@linux:~$ tr [a-z] [A-Z] <<< eXaMPLe
EXAMPLE
user@linux:~$ 

user@linux:~$ tr [A-Z] [a-z] <<< eXaMPLe
example
user@linux:~$ 

마지막 두 개의 "정격 케이스"와 "문장 케이스"는 어떻습니까?

가능합니까?

그렇다면 알려주십시오.

그렇지 않다면 대안은 무엇입니까?

답변1

쉘이 와일드카드를 fish지원하지 않는 한 [...]이를 인용해야 합니다 [:lower:]. [A-Z]그렇지 않으면 쉘이 이를 현재 디렉토리의 일치하는 파일 목록으로 확장할 수 있습니다(일치하는 것이 없으면 오류를 보고합니다).

tr '[:lower:]' '[:upper:]'

기타 참고사항:

  • GNU 구현은 tr단일 바이트 문자만 지원하므로 UTF-8 로케일에서는 분음 부호 없이 영어 문자만 대문자로 표시합니다.
  • tr '[A-Z]' '[a-z]'괜찮지만 간단하게 이 작업을 수행할 수도 있습니다 tr A-Z a-z(POSIX 호환 구현에서). 그러나 ABCDEFGHIJKLMNOPQRSTUVWXYZC/POSIX 로케일에서만 일치가 보장됩니다.

GNU 구현을 사용하여 각 단어의 첫 글자를 대문자로 표시하려면 sed다음을 수행할 수 있습니다.

sed -E "s/[[:alnum:]_'-]+/\u&/g"

는 포함되지만 '다른 구두점은 포함 되지 않습니다 .-_foo-bar2baz,fooFoo-bar2baz,Foo

이는 멀티바이트 문자에 대해 작동하지만 대부분의 로케일에서는 문자를 다음과 같이 처리하지 않기 때문에 일반적으로 문자 결합에는 작동하지 않습니다 alnum.

$ echo $'ste\u0301phane' | sed -E "s/[[:alnum:]_']+/\u&/g"
StéPhane

이를 설명하기 위해 로 전환하면 perl다음과 일치할 수 있습니다 \pM.

$ echo $'ste\u0301phane chazelas' | perl -Mopen=locale -pe 's/[\w\pM'\''-]+/\u$&/g'
Stéphane Chazelas

또한 이는 first(첫 번째 문자가 합자 문자임) 로 변환됩니다 FIrst. ucfirst()대신 uc()/ 를 사용하면 \u이 문제를 피할 수 있습니다 .

$ echo 'first second' | perl -Mopen=locale -pe 's/[\w\pM'\''-]+/ucfirst$&/ge'
First Second

문장 대문자 사용의 경우 매우 까다롭습니다. 텍스트 시작 부분이나 문장 구분 기호(예: ..,, ?... ) 또는 문장 소개자( ¿, ) 뒤의 첫 글자를 대문자로 사용하여 사이에 공백을 허용해야 합니다. , 하지만 , , , , , ...) ¡과 같은 것도 있습니다 . 지원하려는 언어에 따라 더 많은 것을 고려해야 할 수도 있습니다.(["«

다음과 같이 이를 수행할 수 있습니다 perl.

perl -0777 -C -pe 's/(^|[.!?…⁇⁈⁉¿¡])[\s([{"`‶‷«]*\K\p{Ll}/ucfirst$&/ge'

이는 UTF-8 로케일 및 입력을 가정하며 일부 사례만 다룹니다.

어쨌든 이것은 음역 tr만으로는 tr이룰 수 있는 일이 아니다.모든문자를 단지 음역이라고 부를 수는 없습니다.

답변2

아니요, 혼자서는 불가능합니다 tr. tr업무를 수행하는 데 필요한 단어나 문장을 이해하지 못합니다.

대안으로 Perl과 Perl의 강력한 패턴 엔진을 사용해 볼 수 있습니다.

$ perl -pe 's/\b[\p{L}\p{Pd}]+/ucfirst lc $&/ge' <<< 'A HEART-SHAPED BOX'
A Heart-shaped Box
$ perl -pe 's/\p{L}.*?[.?!]/ucfirst lc $&/ge' <<< 'for sale. baby shoes. never worn.'
For sale. Baby shoes. Never worn.

그러나 위의 해결 방법은 빠르고 지저분하며 가능한 모든 사례를 다루지는 않으며 조정(비라틴어 및 비ASCII 라틴 문자, 로케일 종속 사례, 대문자로 표기되지 않은 기사), 문장에서 고유 명사를 대문자로 표시하는 등의 작업이 필요합니다. ). 그러면 역시 둘 다 할 수 없습니다 tr.

답변3

tr단일 문자를 다른 단일 문자로 변경(또는 삭제)만 할 뿐 어떤 문자의 컨텍스트도 이해하지 못합니다. 따라서 단어의 시작, 중간, 끝 부분에 있는 문자를 구분할 수 없습니다. "단어"가 무엇인지조차 모릅니다.

텍스트를 다음으로 변경하세요.타이틀 케이스("적절한 상황"이라고 부르는 것) 또는 문장 상황은 사용이 불가능합니다 tr.

개별 캐릭터에 대한 컨텍스트를 제공하는 도구가 필요합니다.

sed다음은 개별 단어를 일치시키고 첫 문자를 변경하여 텍스트를 제목 케이스로 변환하는 간단한 GNU 프로그램입니다 .

$ sed 's/\<\([[:lower:]]\)\([[:alnum:]]*\)/\u\1\2/g' file
There Is No Danger On The Roof. There Is No Cow On The Ice.

\<전환 지점(예: 단어의 시작)에서 단어가 아닌 문자와 단어 문자 간의 일치입니다. 정규식의 나머지 부분은 소문자와 그 뒤에 임의 개수의 영숫자가 오는 것과 일치합니다. 일치하는 항목이 있으면 소문자를 대문자로 변경하고 나머지 단어를 추가합니다. 첫 글자의 대문자 사용은 GNU sed확장을 사용합니다(대부분의 다른 구현에는 적용되지 않습니다 sed).

텍스트의 문장 쉘링을 위해 또 다른 간단한 GNU 변형이 있습니다 sed:

$ sed 's/\<\([[:lower:]]\)\([^[:punct:]]*\)/\u\1\2/g' file
There is no danger on the roof. There is no cow on the ice.

이는 거의 동일하지만 영숫자 문자인 단어를 일치시키는 대신 구두점이 아닌 문자열을 일치시킵니다.

이는 질문에 표시되는 유형의 매우 간단한 텍스트에만 적용됩니다. sed예를 들어 두 번째는 구두점과 일치하기 what's that?때문에 올바르게 처리되지 않습니다 .'[[:punct:]]

답변4

zsh처음 3개에는 L, U, 매개변수 확장 플래그가 있고, 첫 번째에는 csh-style / 수정자 또는 ksh-style / 이 있으며, 네 번째에는 캡처링 그룹을 사용하여 ksh-style을 사용하여 실행할 수 있습니다.C:l:utypeset -u-l${param//pattern/replacement}

text='The RIVER dee in Aberdeen can be cold,
 so i shiver when i swim. Scotland is STILL beaUtIful though.
 eveN when it RAINS? "YES! of course", is the obvious answer.'
$ print -r -- ${(L)text}
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ print -r -- ${(U)text}
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ print -r -- ${(C)text}
The River Dee In Aberdeen Can Be Cold,
 So I Shiver When I Swim. Scotland Is Still Beautiful Though.
 Even When It Rains? "Yes! Of Course", Is The Obvious Answer.
$ print -r -- $text:l
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ print -r -- $text:u
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ typeset -l text
$ print -r -- $text
the river dee in aberdeen can be cold,
 so i shiver when i swim. scotland is still beautiful though.
 even when it rains? "yes! of course", is the obvious answer.
$ typeset -u text
$ print -r -- $text
THE RIVER DEE IN ABERDEEN CAN BE COLD,
 SO I SHIVER WHEN I SWIM. SCOTLAND IS STILL BEAUTIFUL THOUGH.
 EVEN WHEN IT RAINS? "YES! OF COURSE", IS THE OBVIOUS ANSWER.
$ set -o extendedglob
$ typeset +u text
$ print -r -- ${${text:l}//(#b)(((#s)|[.!?…⁇⁈⁉¿¡])[[:space:][\{\"\`‶‷«]#)([[:lower:]])/$match[1]${match[3]:u}}
The river dee in aberdeen can be cold,
 so i shiver when i swim. Scotland is still beautiful though.
 Even when it rains? "Yes! Of course", is the obvious answer.

내 다른 답변과 동일한 경고입니다.

관련 정보