我有一个如下所示的 CSV 文件:
productSku-1,attribute1,2,3
productSku-1,attribute4,5
productSku-1,attribute4,5
productSku-2,attribute1,2,3
productSku-2,attribute4,5
productSku-3,attribute1,1
我试图将相同的产品属性“折叠”到一行中,同时删除 productSku
的额外实例。因此,我将产品与下一行相匹配,然后删除接下来的 productSku
行以及换行符,将其压缩为一行。在上面的示例中,结果应如下所示:
productSku1,attribute1,2,3,attribute4,5,attribute4,5
productSku2,attribute1,2,3,attribute4,5
productSku3,attribute1,1
我认为以下替换命令可以工作,但我从未使用过 \%
符号。
:%s/(^[A-Za-z0-9-]+)(.)((\%(\n\1)(.))+)/\1\2\3
我以为它会从匹配 \3
中排除匹配项...但它不起作用。
最佳答案
解决这个问题的一种方法是这样的:
:sort
qqjkdt,:g/<C-r>"/norm dt,-gJ<Enter>0P+q
10000@q
一步一步
:sort
- 按productSku对所有行进行排序
qq
- 开始录音,参见:help qq
jk
- 这是一个小的宏黑客...如果我们到达最后一行,它将抛出一个错误,并且命令的其余部分将不会执行。
dt,
- 删除productSku
:g/
- 启动:global
命令,请参阅:help :global
<C-r>"
- 插入 "
的内容注册(我们删除的productSku)
norm
- :help :normal
的缩写
dt,
- 删除productSku,因为我们不需要它们
-
- 转到上一行
gJ
- 连接行时不要有任何空格
<Enter>
- 完成:global
命令
0P
- 将productSku放回行首
+
- 向下移动一行
q
- 完成录制
10000@q
重复录音 10k 次(如果需要的话可以更多)
关于regex - 在 Vim 中排除与 ‘\%’ 的匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909115/