[英]Vim: Replace first word on each line of selection with number in list
我有一个很大的文件,其中包含一个带有混杂数字的选择。 它应该是1、2、3,...的序列,但有几行搞砸了。 我想改变像
富
酒吧
1个foobar
12345 foobar
6546458 foobar
4个foobar
至
富
酒吧
1个foobar
2 foobar
3 foobar
4个foobar
我知道我可以使用3,$
类的东西来选择我关心的行,并put = range(1,1000)
来创建以所需数字开头的新行,但是我想将这些数字放在当前有数据的行上,而不是新行。 混杂的数字长几个字符,但总是一个字。 谢谢。
请执行下列操作:
:let i=1
:g/^\d\+/s//\=i/|let i=i+1
设置一些变量( let i=1
)用作我们的计数器。 在以数字( :g/^\\d\\+/
)开头的每一行中,我们执行替换( :s//\\=i/
),以用我们的计数器( \\=i
)替换模式,然后增加我们的计数器( let i=i+1
)。
:g
呢? 为什么不只是:s
? 您可以使用替换命令来完成此操作,但是sub-replace-expression \\=
需要一个表达式来求值(请参见:h sub-replace-expression
)。 因为let i = i + 1
是一条语句,所以它将无用。
有几种方法可以解决此问题:
map(arr, 'v:val+1')[0]
:g
技巧 使用就地数组修改的完整示例:
:let i=[1]
:%s/^\d\+/\=map(i,'v:val+1')[0]
就个人而言,我将使用您能记住的任何方法。
:h :s
:h sub-replace-expression
:h :g
:h :let
:h expr
:h map(
:h v:val
/^\d\+\s -- Searches for the first occurrence
ciw0<Esc> -- Replaces the word under cursor with "0"
yiw -- Copies it
:g//norm viwp^Ayiw
-- For each line that matches the last search pattern,
-- Replace the current word with copied text,
-- Increment it,
-- Copy the new value.
( <Esc>
只是Esc 。 ^A
输入为Ctrl + V , Ctrl + A )
ciw
更改内部单词。 ( :help c
) :g
全局搜索。 ( :help :g
) viw
选择内部单词 ( :help v
) p
粘贴(替换选择) ( :help v_p
) ^A
递增。 ( :help CTRL-A
) yiw
-Yank内部单词。 ( :help y
) 您可以使用以下功能:
function Replace()
let n = 1
for i in range(0, line('$'))
if match(getline(i), '\v^\d+\s') > -1
execute i . 's/\v^\d+/\=n/'
let n = n + 1
endif
endfor
endfunction
它遍历整个文件,检查每行是否以数字开头,后跟空格字符,并用随每次更改而增加的计数器进行替换。
像这样称呼它:
:call Replace()
在您的示例中得出:
foo
bar
1 foobar
2 foobar
3 foobar
4 foobar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.