Ferramenta CLI para selecionar graficamente linhas durante comandos canalizados

0

Existe uma ferramenta semelhante a escolha que eu possa conectar a uma cadeia de comandos que me permita selecionar (várias) linhas para o próximo passo?

choose infelizmente não "repassa" a linha selecionada, em vez disso, se você fizer um comando, selecionar uma linha e tentar fazer alguma coisa com ela, o resultado é:

% echo "a\tb\ncde\tf" | choose | wc
cde      f
       0       0       0
    
por Orangenhain 16.04.2014 / 23:31

2 respostas

1

É open source, e a lógica básica não é muito complicada, então você pode sempre modificá-la.

Coloque as seguintes linhas em um arquivo (digamos, choose.diff ) no mesmo diretório que choose e, em seguida, execute 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
    
por 17.04.2014 / 08:38
0

Não tenho certeza se isso combina com você, mas se for sobre a seleção de linhas de um fluxo de texto, sed sempre deve resolver você. Confira os exemplos abaixo:

Eu quero produzir apenas as linhas que não correspondem a uma determinada expressão regular (regex) - neste exemplo, omita todas as linhas que contenham a palavra "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

No próximo, mostre apenas as linhas que contêm a palavra "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 piped line
that is a line in a pipe

Como alternativa, faça a saída apenas da segunda e terceira linhas:

$> 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

E muitos outros exemplos e possibilidades ... Confira sed1line

Definitivamente, também há muitas alternativas mais capazes, awk , perl , etc

    
por 17.04.2014 / 08:41