首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S替换行上的特定N<g事件

S替换行上的特定N<g事件
EN

Stack Overflow用户
提问于 2021-11-01 21:56:21
回答 4查看 194关注 0票数 5

我尝试使用逗号(,)来分隔前两个数字字段中的数千个,使用vim command

代码语言:javascript
复制
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/g

但是在这种情况下,它还会在第二行的9,995中添加逗号,我可以用什么来替换特定的N

输入

代码语言:javascript
复制
BitstreamCyberCJK;Freeware;30275;28686;v2.0 ;beta (1998-03-17)
Y.OzFontN;Freeware;21957;7621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)

预期产出

代码语言:javascript
复制
 BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 ;beta (1998-03-17)
 Y.OzFontN;Freeware;21,957;7,621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-11-01 23:25:04

有一种方法可以重复最后一个命令:@:,也可以指定重复次数,例如:10@:

所以,从只替换第一个匹配开始:%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/

然后,就像我们已经做过的N替换一样,重复N-1次。

例如,要替换前10个数字,请使用:

代码语言:javascript
复制
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/
9@:
票数 6
EN

Stack Overflow用户

发布于 2021-11-02 08:42:14

我将使用更短、更易于管理的搜索模式:

代码语言:javascript
复制
:%s/\(\d\)\(\d\{3}\);/\1,\2;/g

然后,我将删除/g标志,只替换每行的第一次匹配,因为目标是明确地不替换所有行上的所有匹配:

代码语言:javascript
复制
:%s/\(\d\)\(\d\{3}\);/\1,\2;

然后,我将在每一行重复最后一个替换:

代码语言:javascript
复制
g&

:help \d:help \{:help :s_flags:help g&

票数 3
EN

Stack Overflow用户

发布于 2021-11-02 08:45:19

首先,我建议你清理一下你的领地:

代码语言:javascript
复制
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/g

其次,g标志最后使vim替换所有出现的事件。如果没有旗子,它只会替换第一个。因为%在每一行上运行替换,所以%s//g将替换每一行的第一次出现。

由于您希望替换前两次出现的情况,所以只需运行两次。然而,我们想在这里变得优雅一点。有一个:&命令来重复最后一个替换。我们甚至可以把它们绑在一起:

代码语言:javascript
复制
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/ | norm %&

更新:其他解决方案可以以相同的方式使用:

代码语言:javascript
复制
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/ | norm g&

代码语言:javascript
复制
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/ | norm :@
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69803190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档