你不能在 standard sed(1) 中这样做,因为那里没有 \u 或 \U 这样的东西。事实上,在我所有的系统(除了一个)上,它都失败了——而且默默地,唉!我在我的 Mac 笔记本电脑和我的 Mac 台式机上都尝试了 sed 版本,然后我在我们的 Solaris 服务器和我们的 OpenBSD 服务器上尝试了它。我也在单独的 AIX 机器上尝试过,当然它在那里不起作用。 :(
但是,您应该能够以这种方式进行移植,这适用于我测试的那些系统:
% cat sample
VI.d5.5
VII.b2.1
VII.b2.2
VII.b2.3
VII.c1
% perl -wpe 's/([^.]+)\.(.)/$1.\u$2.$2/' /tmp/sample
VI.D.d5.5
VII.B.b2.1
VII.B.b2.2
VII.B.b2.3
VII.C.c1
这不仅更便携,而且更容易。
这应该适用于过去 20 年发布的任何 Perl 版本,包括 perl4。但是,如果您生活在最前沿,因此至少安装了 5.10,那么您可以改用这种方式:
% perl -M5.10.0 -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample
VI.D.d5.5
VII.B.b2.1
VII.B.b2.2
VII.B.b2.3
VII.C.c1
‑M5.10.0 只是为了确保您确实拥有并加载了 5.10 功能集。
Unicode 呢?
现在假设您的示例数据中包含 Unicode:
% cat /tmp/sample.utf8
Ⅵ.ð5.5
Ⅷ.ß2.3
Ⅺ.ç1
% uniquote /tmp/sample.utf8
\N{U+2165}.\N{U+F0}5.5
\N{U+2167}.\N{U+DF}2.3
\N{U+216A}.\N{U+E7}1
% uniquote -v /tmp/sample.utf8
\N{ROMAN NUMERAL SIX}.\N{LATIN SMALL LETTER ETH}5.5
\N{ROMAN NUMERAL EIGHT}.\N{LATIN SMALL LETTER SHARP S}2.3
\N{ROMAN NUMERAL ELEVEN}.\N{LATIN SMALL LETTER C WITH CEDILLA}1
我可以向您保证,您不会找到在该数据上执行正确操作的 sed 版本。它会搞砸的。我去了我们牺牲的 Linux 机器,虽然他们在那里使用的 ɢɴᴜsed 可以处理您的示例数据,但它拒绝在我更高级的 Unicode 数据集中对其中一个字符进行映射,即使我已经正确设置了区域设置。但是perl 版本仍然做对了。
但是使用 perl,只需添加 ‑CSD 命令行选项来告诉 perl 数据文件和 std{in,out,err} 都是 UTF-8 格式,然后运行相同的命令,你会看到真的 Qᴜɪᴛᴇ Iɴᴛᴇʀᴇsᴛɪɴɢ:
% perl -CSD -wpe 's/([^.]+)\.(.)/$1.\u$2.$2/' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.Ss.ß2.3
Ⅺ.Ç.ç1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.Ss.ß2.3
Ⅺ.Ç.ç1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\U$1./' /tmp/sample.utf8
Ⅵ.Ð.ð5.5
Ⅷ.SS.ß2.3
Ⅺ.Ç.ç1
如您所见,\u 所做的 titlecasing 与 \U 所做的 uppercasing 之间存在差异。这是因为小写字母“ß”在标题中是“Ss”,但在大写中是“SS”。离奇但真实!诚然,希腊字母比我们使用的拉丁字母更容易发生这种事情,但你仍然想把它做好。
这里是all uniquoted,所以你可以看到我们正在谈论的代码点:
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8 | uniquote
\N{U+2165}.\N{U+D0}.\N{U+F0}5.5
\N{U+2167}.Ss.\N{U+DF}2.3
\N{U+216A}.\N{U+C7}.\N{U+E7}1
% perl -CSD -wpe 's/[^.]+\.\K(?=(.))/\u$1./' /tmp/sample.utf8 | uniquote -v
\N{ROMAN NUMERAL SIX}.\N{LATIN CAPITAL LETTER ETH}.\N{LATIN SMALL LETTER ETH}5.5
\N{ROMAN NUMERAL EIGHT}.Ss.\N{LATIN SMALL LETTER SHARP S}2.3
\N{ROMAN NUMERAL ELEVEN}.\N{LATIN CAPITAL LETTER C WITH CEDILLA}.\N{LATIN SMALL LETTER C WITH CEDILLA}1
这样是不是很酷?