Я использовал dialog
никогда раньше, но, возможно, я все еще могу помочь. Попробуйте это:
declare -a args=()
while read
do
args+=("$REPLY" "")
done < <( grep '@' example.txt )
dialog --menu "Please select the line you want to edit" 40 60 34 "${args[@]}"
Как это работает?
dialog --menu
принимает следующие аргументы:
Как создать такой список строк из нашего grep
вывода? Неудачная попытка описана ниже, здесь рабочая.
Команда read
читает одну строку за раз из стандартного ввода (на который мы перенаправили вывод grep
) и помещает его (если мы не даем другие параметры или аргументы) в переменную REPLY
.
Затем мы добавляем это значение (которое указывается как один элемент) в массив args
, и дополнительно один ""
, чтобы добавить пустую строку в массив.
Мы должны использовать синтаксис < <( ... )
для перенаправления, поскольку обычный |
создает подоболочку для второй команды, что приводит к тому, что изменения переменных не передаются обратно в исходную оболочку. (<
означает чтение входных данных из файла , а <( ... )
создает канал для чтения выходных данных команды и приводит к ее имени файла.)
Затем мы используем расширение параметра "${args[@]}"
- @
приводит к тому, что каждый элемент указывается в кавычках в качестве результата. Так что для вашего примера командная строка теперь выглядит как
dialog --menu "Please select the line you want to edit" 40 60 34 "Name Surname mymail@mail.com" "" "Another New person@database.loc" ""
Это создает двухстрочное меню с полными строками в качестве «тега» и пустой строкой в качестве пояснения.
Вам понадобится какой-то способ перехватить стандартный вывод ошибок, поскольку он помещает результат туда.
Еще одна идея, которая не работает:
Вопрос в том, как получить вывод grep
в командной строке dialog
, чтобы он формировал два аргумента для каждой строки.
Здесь помогают следующие синтаксические конструкции:
- Подстановка команд:
$( cmd )
выполняет команду и преобразует результат в строку, которая затем используется в точке командной строки.
Итак, нам нужна какая-то команда, которая создает два «слова» для каждой строки вывода grep (поскольку ваш файл даст три слова). Поскольку вы уже используете sed, почему бы не использовать его и здесь?
Команда sed s/^.*$/"&" ""/
заменяет каждую строку строкой, заключенной в ""
, за которой следуют еще две кавычки.
"Name Surname mymail@mail.com" ""
"Another New person@database.loc" ""
Идея была бы теперь использовать
dialog --menu "Please select the line you want to edit" 40 60 34 $( sed -e 's/^.*$/"&" ""/' < input )
но, к сожалению, разделение слов в bash не учитывает "" после подстановки команд, поэтому bash дает шесть аргументов "Name
, Surname
, mymail@mail.com"
, ""
, "Another
, New
, person@database.loc"
и ""
для программы dialog
. (Фактически, использование ""
для запрета расщепления, похоже, работает только для кавычек, заданных литералом в источнике или в eval
- но здесь eval не работает, так как у нас тоже есть разрывы строк.)