Инструмент CLI для графического выбора линий во время конвейерных команд
Есть ли подобный инструмент, который я могу подключить к цепочке команд, которая позволит мне выбрать (несколько) строк для следующего шага?
choose
к сожалению, не "пропускает" выбранную вами строку, вместо этого, если вы выполняете команду, выбираете строку и пытаетесь что-то с ней сделать, что вы получите:
% echo "a\tb\ncde\tf" | choose | wc
cde f
0 0 0
3 ответа
Это открытый исходный код, и основная логика не очень сложна, поэтому вы всегда можете просто изменить ее.
Поместите следующие строки в файл (скажем, choose.diff
) в том же каталоге, что и choose
затем беги patch -p1 < choose.diff
:
--- a/choose
+++ b/choose
@@ -164,8 +164,8 @@ def do_it(auswahl):
index = select_entry(auswahl,
header_text=u'Navigate by pressing ↑ and ↓, select by pressing Enter')
- # print chosen string
- print(orig_auswahl[index])
+ # return chosen string
+ return orig_auswahl[index]
if __name__=="__main__":
@@ -179,7 +179,7 @@ if __name__=="__main__":
sys.__stdin__ = sys.stdin = open('/dev/tty')
os.dup2(sys.stdin.fileno(), 0)
- do_it(auswahl)
+ choice = do_it(auswahl)
#restore old stdout
sys.stdout.flush()
@@ -190,3 +190,5 @@ if __name__=="__main__":
sys.__stdout__ = sys.stdout = old_out
sys.__stdin__ = sys.stdin = old_in
sys.__stderr__ = sys.stderr = old_err
+
+ print choice
Не уверен, что это вам подходит, но если речь идет о выделении строк из потока текста, sed
всегда должен разобраться с тобой. Проверьте примеры ниже:
Я хочу вывести только те строки, которые не соответствуют определенному регулярному выражению (регулярное выражение) - в этом примере опустите все строки, содержащие слово "pipe".
$> echo -e "this is a line\nthat is a line\nthis is a piped line\nthat is a line in a pipe" | sed '/pipe/d'
this is a line
that is a line
В следующем выводите только те строки, которые содержат слово "труба"
$> echo -e "this is a line\nthat is a line\nthis is a piped line\nthat is a line in a pipe" | sed '/pipe/!d'
this is a piped line
that is a line in a pipe
В качестве альтернативы выведите только 2-ю и 3-ю строки:
$> echo -e "this is a line\nthat is a line\nthis is a piped line\nthat is a line in a pipe" | sed -n '2,3p'
that is a line
this is a piped line
И еще много примеров и возможностей... Проверьте sed1line
Определенно, есть много более способных альтернатив, awk
, perl
, так далее
Вы ищете!
Это интерактивный фильтр Unix для командной строки, который можно использовать с любым списком; файлы, история команд, процессы, имена хостов, закладки, коммиты git и т. д.
Обратите внимание, что помимо навигации по стрелкам вы можете фильтровать в интерактивном режиме, записывая выражения. Вы захотите позвонитьfzf
с-m
/--multi
для множественного выбора.
Также см. связанные проекты с инструментами, созданными людьми на основе fzf, ссылки на которые приведены в нижней части файла readme.
Сейчас он доступен в пакетах по умолчанию для Debian и Ubuntu, но до Debian 10 Buster и Ubuntu 19 или 20pick
был ближайшим аналогом.
Я настоятельно рекомендую настроить fzf в качестве селектора истории по умолчанию ctrl-rв соответствии с инструкциями по привязке клавиш в файле readme, которые по умолчанию настраиваются с помощью сценария ручной установки, а не с помощью пакетов debian/ubuntu, однако это можно сделать вручную , легко для bash/zsh/ рыба/вит.
Баш:
Добавьте эту строку в ~/.bashrc, чтобы включить привязки клавиш fzf для Bash:
source /usr/share/doc/fzf/examples/key-bindings.bash
Добавьте эту строку в ~/.bashrc, чтобы включить нечеткое автозаполнение для Bash:
source /usr/share/doc/fzf/examples/completion.bash