如何在不使用鼠标的情况下在命令行上选择第 n 个结果

如何在不使用鼠标的情况下在命令行上选择第 n 个结果

我得到这个别名用于递归搜索文件并且不区分大小写

type fr
fr is aliased to `find . | grep -i'

假设我正在搜索一个文件

fr nsstring+util
./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.d
./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.dia
./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.o
./SmartTaxi/Classes/Categories/NSString+Util.h
./SmartTaxi/Classes/Categories/NSString+Util.m

我想选择最后一个文件...而不必离开键盘并突出显示它等...在 CLI 上有没有快捷方式?

更具体地说..整个场景是 - 搜索文件 - 查看检索到的结果 - 基本上对其中一个执行命令..在这种情况下,我只想运行

vi SmartTaxi/Classes/Categories/NSString+Util.m

无需离开键盘

更新:

这个想法是,这个命令必须分两部分完成:

  • fr 文件名并手动查看返回的结果。可能有很多结果,所需的结果可能在任何其中一条线
  • vi %上述命令的结果% 在特定行

答案1

无需离开键盘,您可以使用 选择特定行sed,并将上一个命令包装在 内$(...),如下所示:

vi "$(fr nsstring+util | sed -ne 3p)"

要选择最后一行,您可以使用$具体的数字,但随后您必须引用该sed命令:

vi "$(fr nsstring+util | sed -ne '$p')"

为了更通用的用途,您可以定义一个函数:

nvi() { n=$1; shift; vi "$(eval "$*" | sed -n ${n}p)"; }

然后,要编辑上一个命令输出的第 5 行,您可以执行以下操作:

fr nsstring+util
nvi 5 !!

答案2

基本上,这个想法是创建一个可以接受参数的函数。参见这里

具体功能如下:

function fr { find . | grep -in "$1"; }
function vifr { vi "`find . | head -$1 | tail -1`"; }

示例用法为:

$ fr nsstring+util
9675:./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.d
9676:./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.dia
9677:./Build/Intermediates/SmartTaxi.build/Debug-iphonesimulator/SmartTaxi.build/Objects-normal/i386/NSString+Util.o
10232:./SmartTaxi/Classes/Categories/NSString+Util.h
10233:./SmartTaxi/Classes/Categories/NSString+Util.m

$ vifr 10233 

最后一个命令的作用与

vi ./SmartTaxi/Classes/Categories/NSString+Util.m

答案3

如果有的话dialog,你可以这样做:

find . | grep -i "$1" | sed -e '/$/G' | xargs -d'\n' dialog --menu "text" 0 0 0 3>&1 1>&2 2>&3 | xargs vi

zenity如果您只有该输出和 X 输出,您可以做类似的事情。

相关内容