我有一个内容如下的文件:
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替换为增量变量?
您可以像其他答案一样声明一个变量,或者:
:%s/^x'\([^']*\)'/\=line('.')-1/
Run Code Online (Sandbox Code Playgroud)
1如果标题行(id,电话,姓名)不在第1行中,则将其替换为标题行的行号。
您只需替换1成0您的代码即可获得关注
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:添加请注意,您可以在替换命令 ( :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"注意:如果上面没有空行,则上述命令不适用于文件中的第一段。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |