是否有一种可移植的方法可以从命令行切换文本大小写?

是否有一种可移植的方法可以从命令行切换文本大小写?

有没有一种方法可以跨 POSIX 操作系统移植并支持区域设置转变命令行中的文本大小写 - 即用大写字母替换小写字母,反之亦然。

使用GNUsed,我可以使用它:

echo 'Yes, I Know IT!' | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
yES, i kNOW it!

这与重音字母配合得很好:

echo Élève | sed -E 's/([[:upper:]]*)([[:lower:]]*)/\L\1\U\2/g'
éLÈVE

但由于它使用了GNU\L扩展,\U因此不可移植。另一方面tr,在我的 Linux 机器上无法正确处理重音字母:

echo 'Élève' | tr '[:lower:][:upper:]' '[:upper:][:lower:]'
ÉLèVE

有什么解决办法吗?

答案1

如果您接受perl,则此解决方案直接复制自Perl,使用 tr 函数同时将大写转换为小写,反之亦然?将为您工作:

echo 'Hello Élève. It is beautiful!' |
    perl -Mopen=locale -Mutf8 -pe 's/([[:upper:]])|([[:lower:]])/defined $1 ? lc $1 : uc $2/eg'

hELLO éLÈVE. iT IS BEAUTIFUL!

我还想知道是否使用类似的东西( gsed ... || tr ... ),以便在具有 GNU 的系统上gsed它会优先,但在其他系统tr大概不是会执行的 GNU。 (非 GNU POSIXtr显然可以正确处理多字节字符。)

相关内容