如何修改fzf命令返回所有选中项的{1}:{2}格式组合?
解决fzf多选时返回{1}:{2}格式空格分隔字符串的问题
你遇到的核心问题是{+1}:{+2}的行为不符合预期——它会把所有选中项的第一个字段拼接在一起,再拼接所有第二个字段,而不是为每个选中项单独组合{1}:{2}。以下是几种可行的修改方案:
方案1:用fzf输出选中行 + awk + paste(最简洁)
直接让fzf输出所有选中的行,再通过后续工具处理每一行并拼接:
echo -e "a 1 10\nb 2 20\nc 3 30\nd 4 40" | fzf -m | awk '{print $1":"$2}' | paste -sd ' ' -
- 工作流程:
fzf -m输出所有选中的行(每行对应一个选中项)awk提取每行的前两个字段,组合成字段1:字段2的格式paste -sd ' ' -将所有行用空格连接成单一字符串
方案2:保留原bind结构的内部处理
如果你需要保留原命令中bind触发的逻辑,可以调整execute内的命令,用{+}获取所有选中行后处理:
echo -e "a 1 10\nb 2 20\nc 3 30\nd 4 40" | fzf -m --bind 'enter:execute(echo "{+}" | awk "{print \$1\":\" \$2}" | paste -sd " " -)+abort'
- 说明:
{+}会将所有选中的行作为整体传递- 后续逻辑和方案1一致,处理后退出fzf(
+abort)
方案3:用awk直接完成拼接(无需paste)
如果不想额外调用paste,也可以让awk一次性完成处理和拼接:
echo -e "a 1 10\nb 2 20\nc 3 30\nd 4 40" | fzf -m | awk '{printf "%s%s:%s", sep, $1, $2; sep=" "} END{print ""}'
- 工作流程:通过
sep变量控制是否添加前置空格,第一行无空格,后续行前加空格,最后END块输出换行符。
内容的提问来源于stack exchange,提问作者Kossak
相关产品推荐
相关产品推荐

