gpt4 book ai didi

regex - 使用 vim 将缩进目录列表转换为完整路径

转载 作者:行者123 更新时间:2023-12-01 23:29:10 24 4
gpt4 key购买 nike

我继承了一组带有缩进目录列表的文件,如下所示:

DirA/  DirA1/  DirA2/    DirA2.1/  DirA3/DirB/DirC/  DirC1/    DirC1.1/      DirC1.1.1/    DirC1.2/

为了迁移到新代码和新结构,我需要将其更改为每一行的完整路径。

DirA/DirA/DirA1/DirA/DirA2/DirA/DirA2/DirA2.1/DirA/DirA3/DirB/DirC/DirC/DirC1/DirC/DirC1/DirC1.1/DirC/DirC1/DirC1.1/DirC1.1.1/DirC/DirC1/DirC1.2/

我更愿意为此使用 vim(如果只是为了增加我的 vim fuu),但我还没有找到如何做到这一点(使用正则表达式、寄存器和/或宏?)。谁能给我一些指示?我将不胜感激。

最佳答案

假设缩进宽度为 2 个空格:

:%s#^\s\+#\=join(split(getline(line('.')-1),'/')[:strlen(submatch(0))/2-1],'/').'/'

概览

想法是获取上一行 (getline(line('.')-1)) 并将该行拆分为目录。然后根据缩进级别 strlen(submatch(0))/2-1 替换前导空格并替换为上一行目录列表的子列表。

细节的荣耀

  • %s#^\s\+#{replacement} - 对以空格开头的行进行替换
  • \={expr} 将产生 {expr} 的结果作为空格的替换 - 这称为子替换表达式
  • getline(line('.')-1) - 获取上一行
  • split(getline(line('.')-1), '/') - 将前面的行拆分为目录段
  • lst[{start}:{end}] - 从列表 lst 创建子列表,从 {start} 开始并结束在索引 {end}
  • lst[:{end}] - 假设列表开始。例如 [0,1,2][:1] 产生 [0,1]
  • submatch(0) - 在子替换表达式中 submatch({n} 将获取捕获组编号,{n}
  • submatch(0) 将产生替换的整个匹配模式。在正常替换中也称为 \0&
  • strlen(submatch(0))/2 将获取当前行的缩进级别
  • strlen(submatch(0))/2-1 将减少 1 个缩进级别。又名。当前行和上一行共有的目录结构部分
  • join({lst}, {glue}) - 将列表作为字符串连接在一起,使用 {glue} 作为列表项之间的分隔符
  • split() 取出的末尾添加一个 /
  • 重要的是要知道 Vim 从顶部开始逐行替换(如@Lieven Keersmaekers 所述)。这意味着我们可以使用上一行来获取共同祖先

有关更多帮助,请参阅:

:h :s
:h sub-replace-expression
:h getline()
:h line()
:h join()
:h sublist
:h strlen()
:h split()

关于regex - 使用 vim 将缩进目录列表转换为完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42532526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com