como selecionar o resultado nth na linha de comando sem usar o mouse

3

Eu tenho este alias para procurar um arquivo de forma recursiva e insensível a maiúsculas

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

e então digamos que estou procurando por um arquivo

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

e eu quero selecionar o último arquivo .. sem ter que sair do teclado e destacá-lo, etc. existe um atalho para isso no cli?

Para ser mais específico, todo o cenário é - procurar por um arquivo - ver resultados recuperados - basicamente, executar um comando em um deles .. neste caso eu só quero correr

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

sem sair do teclado

Atualização:

A ideia é que esse comando deve ser feito em duas partes:

  • fr nome do arquivo e ver manualmente os resultados retornados .. pode haver muitos resultados e o desejado pode estar em qualquer uma das linhas
  • vi% resultado do comando acima% em uma linha específica
por abbood 26.12.2014 / 09:00

3 respostas

2

Sem sair do teclado, você pode selecionar linhas específicas com sed e agrupar o comando anterior em $(...) , desta forma:

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

Para selecionar a última linha, você pode usar $ em vez de um número concreto, mas você deve citar o comando sed :

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

Para um propósito mais geral, você pode definir uma função:

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

Em seguida, para editar a quinta linha da saída do comando anterior, você pode fazer isso:

fr nsstring+util
nvi 5 !!
    
por 26.12.2014 / 09:22
0

Basicamente, a ideia é criar uma função que aceite argumentos. veja aqui

aqui estão as funções:

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

uma amostra de uso é:

$ 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 

os últimos comandos fazem o mesmo que

vi ./SmartTaxi/Classes/Categories/NSString+Util.m
    
por 26.12.2014 / 09:57
0

Se você tiver dialog , poderá fazer isso:

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

Você pode fazer algo semelhante com zenity se tiver apenas essa e X saída.

    
por 26.12.2014 / 11:44