【问题标题】:Convert function arguments from upper to lowercase in bash在bash中将函数参数从大写转换为小写
【发布时间】:2012-06-25 06:30:52
【问题描述】:

当我不小心打开了大写锁定并尝试运行一些区分大小写的工具时,我正在尝试创建一个方便的功能来解决问题。

例如我偶尔会发现自己输入的是MAKE DEBUG 而不是make debug

我现在所拥有的非常简单:alias MAKE="make" 并编辑生成文件以复制规则,例如DEBUG: debug.

我更喜欢一种适用于参数的解决方案,而无需修改所涉及的工具。

【问题讨论】:

  • 你真的用那个大写锁定键吗?令人印象深刻;-)
  • 我发现自己使用了很多真正喜欢 DEFINE_EVERYTHING_IN_CAPS 的库。
  • 这确实令人印象深刻。我,我只是在输入 REALLY_LONG_NAMES_OF_VARIABLES_OR_WHATEVER 时扭曲手指以按住 shift,从而严重伤害了我的手。

标签: bash case-sensitive tr


【解决方案1】:

使用 GNU sed

如果您只想让 makefile 中的所有内容都小写,您可以使用 GNU sed 将整个内容小写:

sed -i 's/.*/\L&/' Makefile

您也可以构建一个更具辨别力的 sed 脚本,但 \L replacement escape 是您的朋友。

使用 tr

由于您使用 tr 标记了您的问题,因此您可能还需要 tr 解决方案。这有点麻烦,因为 tr 不会进行就地翻译,但您可以随机播放临时文件或使用 moreutils 中的海绵。例如:

tr '[[:upper:]]' '[[:lower:]]' < Makefile | sponge Makefile

【讨论】:

    【解决方案2】:

    这涉及一个脚本,但避免了我之前尝试的 Ctrl-D 问题:

    对于每个命令,一个别名

    alias MAKE="casefixer make"
    

    然后是我在/usr/local/bin/casefixer 创建的以下文件:

    #!/bin/bash
    command=`echo $1 | tr '[:upper:]' '[:lower:]'`       # convert 1st arg to lowercase, it's the command to invoke
    shift                                                # remove 1st arg from $*
    $command `echo "$*" | tr '[:upper:]' '[:lower:]'`    # convert arguments to lowercase, and invoke the command with them
    

    【讨论】:

      【解决方案3】:

      使用@Clayton Hughes 的casefixer 解决方案,这里有一个解决方案可以处理参数中的空格等有趣的事情($* 搞砸了):

      casefixer() { eval "$(printf "%q " "$@" | tr '[:upper:]' '[:lower:]')"; }
      alias MAKE='casefixer make'
      

      注意:eval 是一件相当危险的事情,引起really bizarre bugs 的名声当之无愧。然而,在这种情况下,双引号和编码命令及其参数与 %q 的组合应该可以防止出现问题。至少,我找不到它做任何意外的案例。

      【讨论】:

        【解决方案4】:

        这里有一个解决方案,虽然它并不完美:

        alias MAKE="make `tr '[:upper:]' '[:lower:]`"
        

        它可以工作,但有一个不幸的问题是我需要在开始执行任何操作之前按 Ctrl-D 发送 EOF。

        【讨论】:

          【解决方案5】:

          这里值得一提的是readline 命令“downcase-word”(默认绑定到M-u)。假设您输入了“MAKE DEBUG”。如果在回车之前捕捉到它,您可以使用C-a 将光标移动到行首。 (否则,请先使用向上箭头返回命令)。然后,每次点击M-u,光标后面的单词都会变成小写,光标会移动到下一个单词的开头。

          这有点费力,而且我看不到一次将整行小写的方法。也许有人可以对此进行改进。

          【讨论】:

          • M-9M-l(字母 ell)将小写接下来的 9 个单词。 M-99M-l 将小写下一个 99。M--M-l 将小写前一个单词。 M--3M-l(如果你使用它而不是Esc,请在按3之前释放Alt)前3。M-u至少在我的系统上默认绑定到upcase-word
          • 在这里我不得不承认我的无知。 X-x 语法是什么意思?我该如何输入?
          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          • 2015-11-28
          • 2022-01-19
          • 1970-01-01
          • 2014-09-27
          • 2018-08-17
          相关资源
          最近更新 更多