как выбрать n-й результат в командной строке, не используя мышь


3

Я получил этот псевдоним для поиска файла рекурсивно и без учета регистра

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% результат вышеуказанной команды% в конкретной строке

@vembutech Я не уверен, что понимаю ... Можете ли вы повторить вышеизложенное на моем примере?
abbood

Я использую Mx grep-find в emacs. Я не знаю, как это сделать в vi.
Умебоши

Ответы:


2

Не покидая клавиатуры, вы можете выбрать определенные строки с помощью 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 !!

это близко .. но что, если я хочу открыть NSString+Util.hвместо этого? результат, который я хочу, не гарантированно будет в последней строке
abbood

я также изменил свой псевдоним, чтобы избавиться от некоторых наворотов ... так что вам cut -dэто не понадобится ... но я все еще задаюсь вопросом о выборе какой линии
abbood

$ - последняя строка в sed. Вместо этого вы можете использовать номер строки, например 4p. Это достаточно близко?
Янош

это работает .. но я бы не сказал, что это пригодно для использования ... это гораздо сложнее набрать все это, чем просто выделение строки .. см. мой ответ
abbood

Смотрите мое обновление, надеюсь, что это более удобно. В любом случае, более эффективно использовать sed -n Npконструкцию, чемhead -N | tail -1
janos

0

По сути, идея состоит в том, чтобы создать функцию, которая может принимать аргументы .. см. Здесь

вот функции:

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

0

Если у вас есть, 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.