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

xor*_*eed 4 shell sed awk text-processing text

我需要所有 2-3 个字符的单词完全大写。1 个字符和 4 个以上字符的单词需要保持不变。

输入:

cat Example
Dog
I
Fish
su
Su adm
Amd Cat ignore
Run Code Online (Sandbox Code Playgroud)

预期输出:

CAT Example
DOG
a
Fish
SU
SU ADM
ADM CAT ignore
Run Code Online (Sandbox Code Playgroud)

sse*_*taH 13

使用GNUsed

$ sed -E 's/\<[[:alpha:]]{2,3}\>/\U&/g' input_file
DOG
I
Fish
SU
SU ADM
AMD CAT ignore
Run Code Online (Sandbox Code Playgroud)

  • 你一定是在跟我开玩笑:GNU `sed` 甚至可以正确处理 unicode!?我使用包含字符串“sté”的文件尝试了您的解决方案,它正确地将其转换为“STÉ”! (9认同)

ter*_*don 7

我会使用 perl 代替:

\n
$ perl -pe 's/\\b\\w{2,3}\\b/uc($&)/eg' file\nCAT Example\nDOG\nI\nFish\nSU\nSU ADM\nAMD CAT ignore\n
Run Code Online (Sandbox Code Playgroud)\n

如果您的文件包含以 UTF-8 编码的非 ASCII 字符,并且您的区域设置使用 UTF-8 作为字符映射,例如st\xc3\xa9应变为 的字符串ST\xc3\x89,则使用:

\n
$ perl -C -pe 's/\\b\\w{2,3}\\b/uc($&)/eg' file\nCAT Example\nDOG\nI\nFish\nSU\nSU ADM\nAMD CAT ignore\nST\xc3\x89\n
Run Code Online (Sandbox Code Playgroud)\n

  • 或者 `perl -pe's/\b\w{2,3}\b/\U$&amp;/g'`,请注意,`\w` 也匹配 ASCII 数字和下划线,并且仅匹配 ASCII 字母。例如,它将把“Stéphane”变成“STéphane”。 (2认同)
  • @StéphaneChazelas `\U` 对我不起作用,我总是使用 `uc()` 所以我不知道为什么它失败,但它似乎正在期待一个包:`无法定位对象方法“U”通过包“cat”(也许你忘记加载“cat”?)在 -e line 1, &lt;&gt; line 1.` 但使用 `$&amp;` 避免了对捕获组的需要,所以我添加了它。我还添加了一个支持 unicode 的版本,谢谢! (2认同)
  • 您必须保留“e”标志。 (2认同)
  • 哦哦!当然:所以 Perl 正在寻找一个名为“U”的函数,明白了。谢谢@StéphaneChazelas! (2认同)