1

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

例如,我偶尔会发现自己在打字MAKE DEBUG而不是make debug.

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

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

4

5 回答 5

2

使用 GNU sed

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

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

您还可以构建一个更具区分性的 sed 脚本,但\L 替换转义是您的朋友。

使用 tr

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

tr '[[:upper:]]' '[[:lower:]]' < Makefile | sponge Makefile
于 2012-06-22T23:57:51.550 回答
1

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

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

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

于 2012-06-23T03:14:04.700 回答
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
于 2012-06-22T22:39:28.867 回答
0

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

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

于 2012-06-22T23:13:38.257 回答
0

这是一个解决方案,尽管它并不完美:

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

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

于 2012-06-22T22:34:03.860 回答