cuo*_*glm 20
这是一个直接的方法sed:
$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy
Run Code Online (Sandbox Code Playgroud)
或者更短的 GNU 方式sed,使用任何在您的语言环境中存在小写<->大写转换的字符:
$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy
Run Code Online (Sandbox Code Playgroud)
如果您可以使用其他工具,例如:
perl (仅限于 ASCII 字母):
$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy
Run Code Online (Sandbox Code Playgroud)
perl (更普遍):
$ echo '???' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
???
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 16
POSIXly,sed除非提供您想要转写的完整字母集,如@cuonglm 所示,否则无法做到这一点。
tr不过可以这样做,这tr就是(音译)的用途:
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Run Code Online (Sandbox Code Playgroud)
但是,在 Linux 上,它有局限性。在tr基于 Linux 的系统上常见的 3 种实现中:
tr,仅适用于单字节字符集。例如,Stéphane Chazelas在 UTF-8 语言环境中,它给出sTéPHANE cHAZELAS而不是sTÉPHANE cHAZELAS. 这是 GNU 的一个已知限制tr。tr从传家宝工具箱中,不工作(你stéphane chazelas)。tr会做的事情。不过在 FreeBSD 上运行正常。您希望它在经过认证的 Unix 系统中也能正常工作。
该bash外壳有一个专门的操作:
in=AbCdE
out=${in~~}
Run Code Online (Sandbox Code Playgroud)
与zsh -o extendedglob:
out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}
Run Code Online (Sandbox Code Playgroud)