代码之家  ›  专栏  ›  技术社区  ›  fqxp Kıvılcım

从命令输出生成关联数组

  •  0
  • fqxp Kıvılcım  · 技术社区  · 7 年前

    我正在编写一个zsh完成函数来完成数据库中的id。有一个程序 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 列表注释 命令,这样我就可以得到这样一个关联数组?

    ( bf848bf6-63d2-474b-a2c0-e7e3c4865ce8 "Note Title" aba21e55-22c6-4c50-8bf6-bf3b337468e2 "Another one" 09ead915-bf2d-449d-a943-ff589e79794a "yet another \"one\"" )
    

    请注意,键中可能有空格。我试着用 sed :

    note_ids=($(listnotes | sed 's/^\(.*\)   \(.*\)$/\1 "\2"/'))
    

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Adaephon Radek    7 年前

    尝试以下操作

    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) 您还可以读取 列表注释 逐行显示 read :

    listnotes | while read; do 
        note_ids+=(${REPLY%% *} ${REPLY#*   })
    done
    

    除非另有规定 阅读 将读取的值放入 REPLY 参数

    推荐文章