有没有一种方法可以跨 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
显然可以正确处理多字节字符。)