2-3개의 문자 단어를 모두 대문자로 써야 합니다. 1자 단어와 4자 이상의 단어는 동일하게 유지되어야 합니다.
입력하다:
cat Example
Dog
I
Fish
su
Su adm
Amd Cat ignore
예상 출력:
CAT Example
DOG
a
Fish
SU
SU ADM
ADM CAT ignore
답변1
GNU 사용sed
$ sed -E 's/\<[[:alpha:]]{2,3}\>/\U&/g' input_file
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
답변2
대신 Perl을 사용하겠습니다.
$ perl -pe 's/\b\w{2,3}\b/uc($&)/eg' file
CAT Example
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
파일에 UTF-8로 인코딩된 비ASCII 문자가 포함되어 있고 로케일에서 sté
로 변환되어야 하는 문자열 과 같이 UTF-8을 문자 맵으로 사용하는 경우 STÉ
다음을 사용하세요.
$ perl -C -pe 's/\b\w{2,3}\b/uc($&)/eg' file
CAT Example
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
STÉ
답변3
awk의 솔루션은 다음과 같습니다.
awk '{ for (i=1; i<=NF; i++) { if (length($i) <= 3) { $i=toupper($i) } } }1' infile
답변4
사용행복하다(이전 Perl_6)
raku -pe 's:g/<?wb> \w**2..3 <?wb>/{$/.uc}/;'
또는
raku -pe 's:g/<|w> \w**2..3 <|w>/{$/.uc}/;'
또는
raku -pe 's:g/<< \w**2..3 >>/{$/.uc}/;'
위의 Raku 코드는 @terdon의 Perl 코드를 상당히 직접적으로 번역한 것입니다. 단어 경계는 Raku <?wb>
로 작성됩니다 <|w>
. 이는 각각 <!wb>
또는 로 부정될 수 있습니다 <!|w>
. 마지막 예에서 왼쪽 단어 경계는 <<
이고 오른쪽 단어 경계는 입니다 >>
. Raku의 일치 변수는 이며 $/
, 철자도 가능합니다 $<>
.
대상 카테고리를 에서 \w
또는 <alpha>
심지어 (약어 ) <alnum>
로 변경할 수 있습니다 .<:Letter>
<:L>
알아채다: \w
밑줄과 일치하지만 <alpha>
및 그렇지 않습니다.<alnum>
<:Letter>
<:L>
위에 언급된 모든 클래스는 유니코드를 지원하므로 어떤 종류의 "대소문자 구분"도 문제가 되지 않습니다. 유니코드로 정의된 <:Ll>
소문자 및/또는 유니코드로 정의된 대문자를 대상으로 <:Lu>
하는 정규식을 작성할 수 있으며 .fc
"foldcase" 루틴을 사용하여 문자를 비교할 수도 있습니다.
입력 예:
cat Example
Dog
I
Fish
su
Su adm
Amd Cat ignore
sté
a
Xa
Xá
Xå
Xà
Xä
Xb
Xß
Xœ
Xþ
예제 출력:
CAT Example
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
STÉ
a
XA
XÁ
XÅ
XÀ
XÄ
XB
XSS
XŒ
XÞ