我需要所有 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
使用GNUsed
$ 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 字符,并且您的区域设置使用 UTF-8 作为字符映射,例如sté
应变为 的字符串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 代码的相当直接的翻译。字的边界<?wb>
用<|w>
Raku书写。这些可以分别被否定为<!wb>
或<!|w>
。在最后一个示例中,左字边界是<<
,右字边界是>>
。 Raku 的匹配变量是$/
,也可以拼写为$<>
。
您可以将目标类别从\w
更改为<alpha>
或<alnum>
甚至更改为<:Letter>
(缩写<:L>
)。注意: \w
and会匹配下划线,而<alpha>
and will则不会。<alnum>
<:Letter>
<:L>
上面提到的所有类都支持 Unicode,因此任何类型的“大小写折叠”都不应该成为问题。您可以编写针对 Unicode 定义的<:Ll>
小写字母和/或 Unicode 定义的<: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Þ
https://docs.raku.org/language/regexes#Anchors
https://raku.org