regex - 在 Vim 中排除与 ‘\%’ 的匹配?

标签 regex vim csv

我有一个如下所示的 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/

相关文章:

javascript - 提取以字母开头的字母数字单词,忽略其他单词

regex - Vim 中的正则表达式匹配组捕获

php - 简单的正则表达式帮助 php

javascript - 匹配函数参数

ios - 在 iOS 设备上读取 csv 文件时出错

python - 从 CSV 文件中读取特定的单元格

python - 在 python 中将 CSV 转换为 JSON 时如何控制节点名称

vim - Vim 中不出现换行符

scala - 让 `f =` 移动到 => 或 ⇒

vim - 如何在非连续行上运行命令行命令,指定单独的行号?