如何通过制表符补全功能进行grep操作?


18

当我在控制台中按Tab键时,得到此输出

显示所有2957种可能性?(是或否)

有什么方法可以使用grep这2957种可能性吗?我想搜索所有带有“ svn”字样的命令。

Answers:


21

解决方案是内置的bash compgen。要从所有可用命令和可通过访问的命令别名grep'svn' $PATH,请键入。

compgen -ac | grep svn

是否要从某个前缀搜索(例如,所有以开头的命令ecrypt)?使用正则表达式。

compgen -ac | grep "^ecrypt"

很好的答案,但是如果要自己尝试完成制表符怎么办?我的意思是,它并不总是命令名触发,而且还命令参数,等等
UncleZeiv


1

这应该是等效的:

for x in `echo $PATH | sed 's/:/ /g'`; do ls $x | grep svn; done

1
for i in $(echo $PATH | tr ":" "\n"); do find $i -type f -perm +111; done | grep svn

除此以外,它与totaam的答案非常类似,这将它的范围限制为可执行文件(如Bash所做的那样)。但是JJE的compgen要好得多了。


1

也许{,.}*svn*在这里有所帮助,例如ls -l /usr/bin/{,.}*svn*<tab>

但是,看看Zsh!此处:http : //www.jukie.net/bart/blog/zsh-tab-completion是一些很好的示例,它们如何帮助您减少制表符完成结果。这还包括否定,例如,如果您希望所有不带单词“ foobar”的制表符完成结果,或者所有结果都带有偶数位的结果都放在首位,子目录制表符完成等等。我改用zsh的原因是所有打开的终端之间都共享历史记录。


0

我不知道compgen,会建议:

ls -d ${PATH//:/\/*svn* } 2>/dev/null

为重击。

${VAR//pattern/replace} replaces in VAR pattern with replace. // is used to replace every pattern, not just the first, which would be just /.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.