从命令输出生成关联数组

时间:2018-03-25 15:59:57

标签: zsh zsh-completion

我正在编写一个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

但引用这样的字符串似乎不起作用,标题中的双引号使其更加困难。

1 个答案:

答案 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参数。