使用 awk 或 sed 将所有小单词(2-3 个字符)转换为大写

使用 awk 或 sed 将所有小单词(2-3 个字符)转换为大写

我需要所有 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>)。注意: \wand会匹配下划线,而<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
Xb

示例输出:

CAT Example
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
STÉ
a
XA
XB
XSS

https://docs.raku.org/language/regexes#Anchors
https://raku.org

相关内容