将所有文本从大写转换为小写,反之亦然?

MEZ*_*UBI 18 sed

我的问题是如何将所有文本从大写转换为小写,反之亦然?那就是改变所有字母的大小写。它必须以sed某种方式进行更换。

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)

  • 您的第二个假设在输入中使用 GNU `sed` 和备用大小写。使用 `sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'` 代替(仍然是 GNU 特定的)。第一个只转换 26 个 ASCII 拉丁字母,而第二个转换任何由您的语言环境识别的字母。`tr` 只在 ASCII 语言环境中有意义。`perl` 只适用于 ASCII 拉丁字母。 (3认同)

Sté*_*las 16

POSIXly,sed除非提供您想要转写的完整字母集,如@cuonglm 所示,否则无法做到这一点

tr不过可以这样做,这tr就是(音译)的用途:

tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Run Code Online (Sandbox Code Playgroud)

但是,在 Linux 上,它有局限性。在tr基于 Linux 的系统上常见的 3 种实现中:

  • 使用 GNU tr,仅适用于单字节字符集。例如,Stéphane Chazelas在 UTF-8 语言环境中,它给出sTéPHANE cHAZELAS而不是sTÉPHANE cHAZELAS. 这是 GNU 的一个已知限制tr
  • tr从传家宝工具箱中,不工作(你stéphane chazelas)。
  • 这不是busyboxtr会做的事情。

不过在 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)