Como obter o número da linha de um item selecionado pelo Zenity

3

Alguém pode me dizer como calcular o número da linha de um item selecionado. Eu gostaria de ter o número de linha específico para se referir a uma sub-rotina que processará a mesma linha de um arquivo diferente.

#! /bin/bash

item=$(zenity --list "Apples" "Peaches" "Pumpkin" "Pie" \
--column="Select your choice" --text="Text above column(s)" --title="My menu")

linenumber=x # Formula to calculate the line number of the selected item here

echo "You selected: $item which is in line number: $linenumber" 

A saída desejada é:

You selected Peaches which is in line number: 2

Atualização:

Este é um exemplo dos itens que são lidos. Eu usei a fruta no script acima para ilustrar um exemplo de linha. Este é um exemplo dos itens específicos. Como você pode ver, parte do texto atual é duplicado, mas em uma linha diferente. Quando o usuário seleciona um item, espero que o Zenity tenha uma opção para mostrar em qual linha foi clicado. Toda vez que é executado, ele terá uma lista diferente de itens.

cairo-dock
Desktop
XdndCollectionWindowImp
unity-launcher
unity-panel
unity-panel
unity-dash
Hud
Your turn - Play esskwa003 in HneO9CtF • lichess.org - Google Chrome
ljames@ubunzeus
ljames@ubuntuserver
ljames@hera5
site
site
ljames@ubunzeus
launcher - Add Unity Entry for Locally Installed Program - Ask Ubuntu - Google Chrome
ljames@ubunzeus
eclipse desktop launcher categories - Google Search - Google Chrome
launcher - Add Unity Entry for Locally Installed Program - Ask Ubuntu - Google Chrome
eclipse
MightyText - Google Chrome
launcher - Add Unity Entry for Locally Installed Program - Ask Ubuntu - Google Chrome
ljames@ubunzeus
Inbox - L. D. James - Mozilla Thunderbird
ljames@hera5
ljames@hera5
ljames@ubunzeus
ljames@hera5
How to get the line number of a Zenity selected Item - Unix & Linux Stack Exchange - Google Chrome
workspace - MyPyDev - ShellTools/SEWork/SEWork/hkrecord.sh - Eclipse - /home/users/l/j/ljames/workspace 
email - Mozilla Thunderbird
command line - Is it possible to control the recording if Audacity is running in the background? - Ask Ubuntu - Google Chrome
Bookmark Manager - Google Chrome
Formatting Sandbox - Meta Stack Exchange - Google Chrome
Apollo III Support - Backing up the Office Computer - Mozilla Thunderbird

Este é o bloco exato que eu tenho para chamar os dados acima:

#!/bin/bash

INPUT=$HOME/infile.txt
# IFS=$'\n'
item=$(while read l
do
    echo "$l"
done <$INPUT|zenity --list --text "sample text " --column "Choose") 
echo "You selected: [$item] which is in line number: [$linenumber"]
    
por L. D. James 06.12.2016 / 22:06

1 resposta

3

Isso funcionou para mim com yad e zenity, e o id da coluna não é visível na GUI:

zenity --list 1 "Apples" 2 "Peaches" 3 "Pumpkin" 4 "Pie" --column="id" \
--column="Select your choice" --hide-column=1 --print-column=1

Agora, para alcançar o mesmo, quando a entrada for um arquivo, você poderá pré-processar o arquivo com awk , por exemplo, awk '{print NR};1' infile e passar o resultado para zenity .
Desde, de acordo com a documentação :

Zenity returns the entries in the first column of text of selected rows to standard output.

seu $item irá armazenar apenas o número da linha (que é a entrada na primeira coluna), não o conteúdo da linha.
Para obter o conteúdo da linha, você precisa processar o arquivo novamente e extrair essa linha com base no número da linha. Então

linenumber=$(awk '{print NR};1' infile | zenity --list --column="No" \
--column="Select your choice" --text="Text above column(s)" \
--title="My menu" --hide-column=1)

então

linecontent=$(sed ${linenumber}'!d;q' infile)

Agora, você tem o número da linha selecionada e seu conteúdo salvo em linenumber e, respectivamente, linecontent .

    
por 07.12.2016 / 02:07

Tags