【问题标题】:How to toggle cases of characters in a string with a one-liner?如何使用单行切换字符串中字符的大小写?
【发布时间】:2015-11-21 03:10:39
【问题描述】:

"I am Groot" 应使用 sed 单行代码更改为 "i AM gROOT"。

我试过了……

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

...,但两个表达式似乎没有并行运行。

有什么建议吗?

【问题讨论】:

  • 欢迎来到 SO。您是否尝试过任何您有疑问的事情?
  • 我试过跟随 sed -e 's/(.*)/\L\1/' -e 's/(.*)/\U\1/' 但是这两个表达式都没有我猜不要并行运行。

标签: bash search replace sed


【解决方案1】:

使用 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

【讨论】:

  • 嗯,这是写单行的一种方法。你确定没有别的办法。不过还是谢谢。
  • @sam1064max 我刚刚在答案中添加了另一种避免暴力破解的 sed 方法。
【解决方案2】:

这可能对你有用(GNU sed):

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

使用了 GNU sed 的评估命令,但为什么不直接使用 tr

注意可以与 -i 选项结合使用,以反转文件的大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多