comment sélectionner un nième résultat en ligne de commande sans utiliser la souris

3

J'ai obtenu ce pseudonyme pour rechercher un fichier de manière récursive et sans distinction de casse

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

et alors disons que je cherche un fichier

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

et je veux sélectionner le dernier fichier .. sans avoir à quitter le clavier et à le surligner, etc. y a-t-il un raccourci pour cela sur le CLI?

Pour être plus précis .. le scénario entier est - rechercher un fichier - voir les résultats récupérés - Essentiellement, exécuter une commande sur l'un d'eux .. dans ce cas, je veux juste courir

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

sans quitter le clavier

Mettre à jour:

L'idée est que cette commande doit être faite en deux parties:

  • fr nomfichier et voir manuellement les résultats renvoyés .. il pourrait y avoir beaucoup de résultats et celui désiré pourrait être en tout une des lignes
  • vi% résultat de la commande ci-dessus% sur une ligne spécifique
abbood
la source
@vembutech je ne suis pas sûr de comprendre .. pouvez-vous répéter le point ci-dessus en utilisant mon exemple?
abbood
J'utilise M-x grep-find dans emacs. Je ne sais pas comment faire ça en vi.
umeboshi

Réponses:

2

Sans quitter le clavier, vous pouvez sélectionner des lignes spécifiques avec sedet envelopper la commande précédente dans $(...), comme ça:

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

Pour sélectionner la dernière ligne, vous pouvez utiliser $ au lieu d'un nombre concret, mais alors vous devez citer le sed commander:

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

De manière plus générale, vous pouvez définir une fonction:

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

Ensuite, pour éditer la 5ème ligne de la sortie de la commande précédente, vous pouvez faire ceci:

fr nsstring+util
nvi 5 !!
janos
la source
c'est proche .. mais si je veux ouvrir NSString+Util.h au lieu? le résultat que je veux n'est pas garanti d'être dans la dernière ligne
abbood
J'ai également modifié mon pseudonyme pour me débarrasser d'une partie du ballonnement .. de sorte que votre cut -d ne sera pas nécessaire .. mais je me demande toujours de choisir quelle ligne
abbood
$ est la dernière ligne de sed. Vous pouvez utiliser un numéro de ligne à la place, par exemple 4p. Est-ce assez proche?
janos
ça marche .. mais je ne dirais pas que c’est utilisable .. c’est plus difficile de taper tout ça au lieu de simplement souligner la ligne .. réponse
abbood
Voir ma mise à jour, espérons que cela est plus utilisable. Dans tous les cas, il est plus efficace d'utiliser sed -n Np construire que head -N | tail -1
janos
0

En gros, l’idée est de créer une fonction capable de prendre des arguments. Voir ici

voici les fonctions:

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

un exemple d'utilisation est:

$ 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 

les dernières commandes font la même chose que

vi ./SmartTaxi/Classes/Categories/NSString+Util.m
abbood
la source
0

Si tu as dialog alors vous pouvez faire ceci:

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

Vous pourriez faire quelque chose de similaire avec zenity si vous avez seulement cela et X sortie.

Thraidh
la source