【问题标题】:upper- to lower-case using sed使用 sed 从大写到小写
【发布时间】:2010-10-15 22:13:52
【问题描述】:

我想更改以下模式:

getFoo_Bar

到:

getFoo_bar

(注意下b)

既不知道foo也不知道bar,替换模式是什么?

我开始写了

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1

但我卡住了:我想写“\2 小写”,我该怎么做?

也许 sed 不适应?

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    使用 sed 将 getFoo_Bar 更改为 getFoo_bar :

    echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/'
    

    大小写字母由:处理

    • \U 将所有文本变为右大写。
    • \u 只将第一个字符变为大写。
    • \L 将所有文本变为右小写。
    • \l 仅使右侧的第一个字符小写。 (注意是小写字母 L)

    该示例只是模式匹配的一种方法,仅基于修改单个文本块。使用示例,getFoo_BAr 转换为 getFoo_bAr,注意 A 没有改变。

    【讨论】:

    • 在 \L 命令之后有什么方法可以让事情恢复正常吗?
    • From gnu.org/software/sed/manual/sed.html : \E 停止大小写转换 \L \U
    • 这是一个很好的答案,远远超出了回答原始问题的范围。它提供了有关在 sed 中处理各种案例转换任务的参考信息。节省了我很多研究时间。谢谢!
    • 这给了我 getFoo_lBar 和 mac 10.8 默认 sed。我猜 mac 不处理 \L 或 \l
    【解决方案2】:
    s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g
    

    测试:

    $ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g'
    getFoo_bar
    

    【讨论】:

    • 为了扩展答案,这是将所有字符转为小写的一般表达式:echo getFoo_Bar | sed -e 's/\([A-Z][A-Za-z0-9]*\)/\L\1/g',产生getfoo_bar
    • 请注意,此解决方案仅适用于 GNU sed。 POSIX sed 中没有 \l/\L/\u/\U/\E。在这种情况下,您可以使用 perl(参见 @user83591's answer to this question)或 awk(参见 my answer to another question)。
    • @mschilli - 你是说 POSIX sed 不理解标记的正则表达式吗?我没有它来测试 - 我有 GNU sed。如果没有,这是一个很大的缺点,不是吗?
    • @GrahamNicholls: From the sed manual: '最后,作为 GNU sed 扩展,您可以包含一个由反斜杠和其中一个字母组成的特殊序列L、l、U、u 或 E。'
    【解决方案3】:

    略短:

    echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
    

    【讨论】:

    • 甜蜜!到处找这样的 +1
    【解决方案4】:

    我能想到的最短时间:

    echo getFoo_Bar | sed 's/_./\L&/'
    

    【讨论】:

      【解决方案5】:

      你可以用 perl 来做这个:

      perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'
      

      \l 是这里的诀窍。

      sed 不对匹配的组进行大写/小写操作。

      【讨论】:

        【解决方案6】:

        如果您想在下划线之后将所有内容都写成小写,那么这对您有用:

        echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
        

        【讨论】:

          【解决方案7】:
          echo getFoo_Bar | sed 's/[Bb]/\L&/g'
          

          【讨论】:

          • 你没有抓住重点。您在此处进行全局搜索/替换,而不是下划线后的搜索/替换。
          猜你喜欢
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 2012-11-13
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          相关资源
          最近更新 更多