You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

代码逻辑说明:

  1. awk部分:自动识别以UUID开头的行,把后续所有行归为该UUID的标题,直到下一个UUID出现。用null字符做分隔符,确保标题里的空格、引号不会被拆分。
  2. zsh读取部分:通过read -d ''按null字符分割内容,完美读取完整的ID和标题,不会出现字段拆分的问题。
  3. 标题优化:可选把换行转为空格、去除首尾空白,让标题显示更整洁。

方法二:纯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

代码逻辑说明:

  1. 先把所有UUID提取出来存入数组,再逐个遍历每个UUID。
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:14:24