我的问题是如何将所有文本从大写转换为小写,反之亦然?也就是改变所有字母的大小写。必须以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
sed
POSIXly,除非提供您想要音译的完整字母集,否则无法完成此操作@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
如果您的主要目标是将文件从下层类转换为上层类,为什么不使用tr
和STDOUT
来转换您的文件:
$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!'
ΑβΓ