我正在编写一个zsh完成函数来完成数据库中的ID。有一个程序QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", Setting::NativeFormat);
settings.setValue("ProxyServer", "127.0.0.1:8080");
settings.setValue("ProxyEnable", 1);
输出如下列表:
listnotes
如何从bf848bf6-63d2-474b-a2c0-e7e3c4865ce8 Note Title
aba21e55-22c6-4c50-8bf6-bf3b337468e2 Another one
09ead915-bf2d-449d-a943-ff589e79794a yet another "one"
...
命令的输出生成关联数组note_ids
,以便获得这样的关联数组?
listnotes
请注意,键中可能有空格。我尝试使用( bf848bf6-63d2-474b-a2c0-e7e3c4865ce8 "Note Title" aba21e55-22c6-4c50-8bf6-bf3b337468e2 "Another one" 09ead915-bf2d-449d-a943-ff589e79794a "yet another \"one\"" )
生成内容:
sed
但引用这样的字符串似乎不起作用,标题中的双引号使其更加困难。
答案 0 :(得分:2)
尝试类似
的内容typeset -A note_ids
for line in ${(f)"$(listnotes)"}; do
note_ids+=(${line%% *} ${line#* })
done
${(f)PARAM}
:将$PARAM
扩展的结果拆分为新行"$(listnotes)"
:将listnotes
逐字输出放入扩展。for line in LIST
:按LIST
分割${(f)…}
中的项目。 note_ids+=(key value)
:将键值对添加到关联数组note_ids
${line%% *}
:从" *"
扩展的末尾剪切匹配line
(后跟任何内容的空格)的最大部分。因此,在包括第一个空格后删除每个,只留下密钥。${line#* }
:从"* "
扩展开始,剪切匹配$line
(后跟三个空格的任何内容)的最小部分。因此,删除密钥和用作分隔符的三个空格。您还可以使用(f)
逐行阅读listnotes
的输出,而不是使用参数扩展标记read
:
listnotes | while read; do
note_ids+=(${REPLY%% *} ${REPLY#* })
done
除非另有说明,否则read
会将读取值放入REPLY
参数。