我有一个编写简单bash脚本的任务,该脚本从文件中添加删除和查看条目。
要求是使用“对话框”
文件中的数据结构:
Name Surname mymail@mail.com
Another New person@database.loc
基本上我已经完成了除删除之外的所有事情,我知道如何进行删除本身(我认为“sed”?)
但我需要使用dialog --menu
来显示搜索结果。
菜单项应该是整行文本我认为在选择项目后我将再次使用“grep”过滤掉唯一条目。
也许有人可以把我放在正确的方向上?
感谢。
答案 0 :(得分:2)
我以前从未使用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
采用以下参数:
成对的标记字符串和描述。
然后在末尾输出所选标记字符串(在stderr上)。
如何从grep
输出创建这样的列表字符串?下面描述了失败的尝试,这里是工作尝试。
read
命令从标准输入(我们重定向grep
输出)一次读取一行,并在{{我们不提供其他选项或参数)中放置它{1}}变量。
然后,我们将此值(引用为一个元素)添加到数组REPLY
,另外还有一个args
将空字符串添加到数组中。
我们必须使用""
语法进行重定向,因为普通< <( ... )
会为第二个命令创建一个子shell,这会导致对变量的更改不会传播回原始shell 。 (|
表示从文件中读取输入,<
创建一个管道来读取命令的输出并生成其文件名。)
然后我们使用<( ... )
参数展开 - "${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
执行命令并将结果转换为字符串,然后在命令行中使用该字符串。因此,我们需要一些命令,为每行grep输出产生两个“单词”(因为你的文件会给出三个单词)。由于你已经在使用sed,为什么不在这里使用呢?
sed命令$( cmd )
用s/^.*$/"&" ""/
中包含的行替换每一行,后跟另外两个引号。
""
现在的想法是使用
"Name Surname mymail@mail.com" ""
"Another New person@database.loc" ""
但不幸的是,bash的分词在命令替换后不尊重“”,因此bash给出了六个参数dialog --menu "Please select the line you want to edit" 40 60 34 $( sed -e 's/^.*$/"&" ""/' < input )
,"Name
,Surname
,mymail@mail.com"
,""
,"Another
,New
和person@database.loc"
到""
计划。 (实际上,使用dialog
来禁止拆分似乎只适用于源中或""
中给定文字的引号 - 但是eval在这里不起作用,因为我们也有换行符。)