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

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

我的问题是如何将所有文本从大写转换为小写,反之亦然?也就是改变所有字母的大小写。必须以sed某种方式通过替换来完成。

答案1

这是一个直接的方法sed

$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy

或者使用 GNU 的更短方法sed,处理您的语言环境中存在小写<->大写转换的任何字符:

$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy

如果您可以使用其他工具,例如:

perl(仅限 ASCII 字母):

$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy

perl(更普遍):

$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ

答案2

sedPOSIXly,除非提供您想要音译的完整字母集,否则无法完成此操作@cuonglm 已显示

不过,它可以完成tr,这就是tr(音译):

tr '[:lower:][:upper:]' '[:upper:][:lower:]'

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

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

但在 FreeBSD 上却可以正常工作。您会期望它在经过认证的 Unix 系统中也能正常工作。


shellbash有一个专用的操作符:

in=AbCdE
out=${in~~}

zsh -o extendedglob

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}

答案3

如果您的主要目标是将文件从下层类转换为上层类,为什么不使用trSTDOUT来转换您的文件:

$cat FILENAME | tr a-z A-Z > FILENAME2

FILENAME你的原始文件在哪里。FILENAME2你转换后的输出文件在哪里。

答案4

ruby有一个字符串方法,类似于命令行的用法perl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

也可以看看ruby-doc 编码

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ

相关内容