Инструмент CLI для графического выбора линий во время конвейерных команд

218
Orangenhain

Есть ли инструмент, подобный для выбора, который я могу подключить к цепочке команд, которая позволит мне выбрать (несколько) строк для следующего шага?

choose к сожалению, не «пропускает» выбранную строку, вместо этого, если вы делаете команду, выберите строку и попытайтесь что-то с ней сделать, что вы получите:

% echo "a\tb\ncde\tf" | choose | wc cde f 0 0 0 
0
Существует также полностью основанное на оболочке решение этой проблемы (в настоящее время также выбирается только одна строка): [Sentaku] (https://github.com/rcmdnk/sentaku) Orangenhain 10 лет назад 0

2 ответа на вопрос

1
jjlin

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

Поместите следующие строки в файл (скажем, 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 
Спасибо! И, объединив это с примером кода `` browse.py`] (https://github.com/wardi/urwid/blob/master/examples/browse.py) в хранилище urwid, я также смог получить несколько -Выбрать. Orangenhain 10 лет назад 0
0
nemesisfixx

Не уверен, что это вам подходит, но если речь идет о выделении строк из потока текста, 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и т. Д.

Похожие вопросы