如何使用单行切换字符串中字符的大小写?

时间:2015-08-26 22:03:42

标签: bash search replace sed

"我是Groot"应该改为"我是gROOT"使用sed one-liner。

我试过......

sed -e 's/(.*)/\L\1/' -e 's/(.*)/\U\1/'

...,但这两个表达似乎并不是并行运行。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

使用sed:

$ echo "I am Groot" | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/'
i AM gROOT

tr更紧凑(但是not unicode-safe):

$ echo "I am Groot" | tr '[:upper:][:lower:]' '[:lower:][:upper:]'
i AM gROOT

另一种sed解决方案(需要GNU sed)

以下内容通过我们认为永远不会出现在sed输入行中的字符的帮助来切换案例。一种可能性是为该角色选择\x00,因为它永远不会成为bash变量的一部分。另一种方法是选择\n因为它永远不是sed输入行的一部分。对于以下内容,选择了\n

输入中的所有小写字符都标记为\n。然后,任何大写字符都转换为小写。最后,任何前面带有\n的字符都会转换为大写:

$ echo "I am Groot" | sed -r 's/[[:lower:]]/\n&/g; s/[[:upper:]]/\L&/g; s/\n(.)/\U\1/g'
i AM gROOT

答案 1 :(得分:0)

这可能适合你(GNU sed):

sesed "s/.*/echo '&'|tr '[:upper:][:lower:]' '[:lower:][:upper:]'/e" file

使用过GNU sed的评估命令,但为什么不只是使用tr

N.B。可以与-i选项一起使用来反转文件的位置。