Fish Shell范围扩展缩写:将{数字..数字}转换为(seq 数字 数字)
Fish Shell 实现{start..end}到(seq start end)的缩写转换
核心问题排查:正则表达式有效性验证
先单独测试正则替换逻辑,确认是否能正确匹配并转换格式:
# 在Fish终端执行以下命令,验证正则是否生效 echo '{218..220}' | string replace -r '\{(\d+)\.\.(\d+)\}' '(seq \1 \2)'
如果输出为(seq 218 220),说明正则逻辑没问题;如果未替换,检查两点:
- Fish版本是否≥3.0(正则缩写是3.0+新增特性)
- 是否正确转义了
{和}:在Fish的ERE正则中,这两个是特殊元字符,必须用\转义才能匹配字面量
完整实现方案
1. 直接用正则缩写实现(推荐)
无需额外函数,直接通过Fish的正则缩写功能完成转换:
# 添加正则缩写,输入{数字..数字}时自动展开为(seq 数字 数字) abbr --regex '\{(\d+)\.\.(\d+)\}' '(seq \1 \2)'
测试:在终端输入{218..220}后按空格/回车,会自动替换为(seq 218 220)
2. 结合自定义函数实现(适合后续扩展)
如果需要后续支持步长(如{1..10..2})等复杂逻辑,可先定义处理函数,再绑定到缩写:
# 定义范围转换函数 function expand_range # 接收输入字符串,执行正则替换 echo (string replace -r '\{(\d+)\.\.(\d+)\}' '(seq \1 \2)' -- $argv) end # 绑定函数到正则缩写 abbr --regex '\{(\d+)\.\.(\d+)\}' expand_range
持久化配置
要让缩写在每次启动Fish时自动生效,把上述命令添加到~/.config/fish/config.fish文件末尾即可。
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

