在bash中将函数参数从大写转换为小写

时间:2012-06-22 22:33:02

标签: bash case-sensitive tr

我正在尝试设置一个便利功能来解决问题,因为我不小心将我的大写锁定,并尝试运行一些区分大小写的工具。

e.g。我偶尔会发现自己键入MAKE DEBUG而不是make debug

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这涉及一个脚本,但避免了我之前尝试的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

答案 2 :(得分:1)

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

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

注意:eval是一件相当危险的事情,因为really bizarre bugs而造成了当之无愧的声誉。但是,在这种情况下,双引号和编码命令及其参数与%q 的组合应该可以防止出现问题。至少,我找不到一个意外的事情。

答案 3 :(得分:0)

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

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

它有效,但有一个不幸的问题,我需要按Ctrl-D在任何事情开始执行之前发送EOF。

答案 4 :(得分:0)

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

这有点费力,而且我没有办法立刻小写整行。也许有人可以改进这一点。