如何在Vim中使用正则表达式替换为递增的数字变量

a4f*_*7lu 4 regex vi vim

我有一个内容如下的文件:

id      phone   name
x'1234' 12345   jack
x'4567' 45678   Jojo
x'7890'  89456  Dio
x'4591'  34872  joseph
Run Code Online (Sandbox Code Playgroud)

我想把它解析成这样:

id  phone   name
1   12345   jack
2   45678   Jojo
3    89456  Dio
4    34872  joseph
Run Code Online (Sandbox Code Playgroud)

我知道基本的正则表达式可以将所有id替换为这样的任何字符串:

:%s/x'\(\w\+\)'/1/g
Run Code Online (Sandbox Code Playgroud)

它将变成:

id  phone   name
1   12345   jack
1   45678   Jojo
1    89456  Dio
1    34872  joseph
Run Code Online (Sandbox Code Playgroud)

如何将id替换为增量变量?

Ken*_*ent 6

一枪

您可以像其他答案一样声明一个变量,或者:

:%s/^x'\([^']*\)'/\=line('.')-1/  
Run Code Online (Sandbox Code Playgroud)

1如果标题行(id,电话,姓名)不在第1行中,则将其替换为标题行的行号。

两步

您只需替换10您的代码即可获得关注

id  phone   name
0   12345   jack
0   45678   Jojo
0    89456  Dio
0    34872  joseph
Run Code Online (Sandbox Code Playgroud)

然后,您可以将光标移动到第一个ID 0,然后按:

ctrl-v G g ctrl-a

它将把0s变成一个序列1

  • ctrl-v:列模式
  • G :选择第一个列,直到最后一行。
  • g+ctrl-a:添加


Wik*_*żew 5

请注意,您可以在替换命令 ( :s) 中使用表达式作为替换字符串。当替换字符串以\=它开头时,它被评估为一个表达式。

在这里,一种可能的解决方案

:let i=1 | g/^x'\d\+'/s//\=i/ | let i=i+1
Run Code Online (Sandbox Code Playgroud)

它查找模式的所有出现(每行一次),^x'\d\+'如果i每次找到匹配项时都会增加该值,则将其替换为该值。正如评论中所指出的,这|g替换“代码”的一部分,因为| 用于一次执行多个命令”

另一个解决方案是使用该line()命令(考虑到您的文件有一个标题顶行,因此您实际上应该1从返回的值中减去line()):

%s/^x'\d\+'/\=line('.')-1/
Run Code Online (Sandbox Code Playgroud)

^x'\d\+'正则表达式匹配

  • ^ - 一行的开始
  • x'-x'字符串
  • \d\+ - 1+ 位数字
  • '- 一个'字符。

在替代命令页面中使用表达式还有其他有趣的“正则表达式中的增量数”示例:

  • 对文件中的所有行进行编号(插入行号后跟一个制表符):
    :%s/^/\=line('.')."\t"/
  • 给一系列行编号(从第 10 行到第 20 行):
    :10,20s/^/\=line('.')."\t"/
  • 从 1 开始按顺序编号一系列行:
    :let counter=0|10,20g//let counter=counter+1|s/^/\=counter."\t"
  • 从 1 开始为范围内的所有段落编号(假设段落由一个或多个空行分隔):
    :let counter=0|1,20g/^$\n^\s*[^\s]/let counter=counter+1|+1s/^/\=counter."\t"
    注意:如果上面没有空行,则上述命令不适用于文件中的第一段。