如何从listnotes输出生成zsh关联数组note_ids用于补全
生成zsh关联数组存储数据库ID与标题
我来帮你搞定这个zsh补全的关联数组生成问题!核心是要准确识别UUID格式的ID,并把后续包含空格、引号的内容对应成标题,下面给你两种可靠的实现方案:
方法一:用awk预处理输出(高效推荐)
这种方式只调用一次listnotes,用awk处理输出并以null字符分隔ID和标题,完美避免标题里的空格干扰zsh的读取逻辑:
# 声明关联数组 typeset -A note_ids # 处理输出并填充数组 listnotes | awk ' BEGIN { # 匹配UUID的正则:8-4-4-4-12格式的十六进制字符串 uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ OFS = "\0" # 用null字符分隔ID和标题,彻底规避空格拆分问题 } { if ($0 ~ uuid_regex) { # 输出上一组ID和标题(如果存在) if (prev_uuid != "") { print prev_uuid, prev_title } prev_uuid = $0 prev_title = "" } else { # 将当前行追加到标题,保留换行(后续可按需转换) prev_title = prev_title (prev_title ? "\n" : "") $0 } } END { # 处理最后一组ID和标题 if (prev_uuid != "") { print prev_uuid, prev_title } }' | while IFS= read -r -d '' uuid && IFS= read -r -d '' title; do # 可选操作:把标题里的换行转成空格,去除首尾空白 title=$(echo "$title" | tr '\n' ' ' | sed 's/^ *//;s/ *$//') # 填充关联数组 note_ids[$uuid]="$title" done
代码逻辑说明:
- awk部分:自动识别以UUID开头的行,把后续所有行归为该UUID的标题,直到下一个UUID出现。用null字符做分隔符,确保标题里的空格、引号不会被拆分。
- zsh读取部分:通过
read -d ''按null字符分割内容,完美读取完整的ID和标题,不会出现字段拆分的问题。 - 标题优化:可选把换行转为空格、去除首尾空白,让标题显示更整洁。
方法二:纯zsh内置命令实现(无需外部工具)
如果不想依赖awk,也可以用zsh自带的正则匹配来处理:
typeset -A note_ids local output=$(listnotes) # 先提取所有UUID存入数组 local -a uuids=("${(@f)$(echo "$output" | grep -Eo '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')}") for uuid in "${uuids[@]}"; do # 提取当前UUID到下一个UUID之间的内容作为标题 local title=$(echo "$output" | sed -n "/^$uuid$/{:a;n;/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/q;p}" | tr '\n' ' ' | sed 's/^ *//;s/ *$//') note_ids[$uuid]="$title" done
代码逻辑说明:
- 先把所有UUID提取出来存入数组,再逐个遍历每个UUID。
- 用sed精准截取当前UUID到下一个UUID之间的内容,处理后作为标题存入关联数组。
验证数组结构
执行完代码后,你可以用下面的命令验证数组内容:
for key value in "${(@kv)note_ids}"; do echo "$key -> $value" done
输出会类似:
bf848bf6-63d2-474b-a2c0-e7e3c4865ce8 -> Note Title aba21e55-22c6-4c50-8bf6-bf3b337468e2 -> Another one 09ead915-bf2d-449d-a943-ff589e79794a -> yet another "one"
用于zsh补全
如果要把这个数组用到补全函数里,参考下面的写法:
_completenotes() { typeset -A note_ids # 插入上面任意一种数组生成代码 # 补全ID时同时显示标题作为提示 compadd -k note_ids } # 把补全函数关联到你的目标命令(比如note命令) compdef _completenotes note
这样输入note + Tab时,就会显示所有UUID,旁边附上对应的标题,方便快速选择。
内容的提问来源于stack exchange,提问作者fqxp
相关产品推荐
相关产品推荐

