Vim:用列表中的数字替换每行选择的第一个单词
我有一个大文件,其中包含一个数字混乱的选择。它应该是一个序列1,2,3。。。但是有几行被搞乱了。我想改变一下 福 酒吧 1福巴 12345福巴 6546458福巴 4福巴 到 福 酒吧 1福巴 2福巴 3福巴 4福巴Vim:用列表中的数字替换每行选择的第一个单词,vim,Vim,我有一个大文件,其中包含一个数字混乱的选择。它应该是一个序列1,2,3。。。但是有几行被搞乱了。我想改变一下 福 酒吧 1福巴 12345福巴 6546458福巴 4福巴 到 福 酒吧 1福巴 2福巴 3福巴 4福巴 我知道我可以使用类似于3,$的方法来选择我关心的行,以及put=range(11000)以我想要的数字开始创建新行,但我想将这些数字放在当前有数据的行上,而不是新行上。混乱的数字有几个字符长,但总是一个单词。谢谢。您可以使用以下功能: function Replace()
我知道我可以使用类似于
3,$
的方法来选择我关心的行,以及put=range(11000)
以我想要的数字开始创建新行,但我想将这些数字放在当前有数据的行上,而不是新行上。混乱的数字有几个字符长,但总是一个单词。谢谢。您可以使用以下功能:
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
您可以使用以下功能:
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
/^\d\+\s--搜索第一个匹配项
ciw0——将光标下的单词替换为“0”
哟,是的
:g//norm viwp^Ayiw
--对于与上次搜索模式匹配的每一行,
--用复制的文本替换当前单词,
--增加它,
--复制新值。
(
只是Esc。^A
输入为Ctrl+V,Ctrl+A)
——更改内部单词李>ciw
——全局搜索李>:g
——选择内部单词李>viw
--粘贴(替换选择)p
——增量李>^A
——猛拉内部单词李>yiw
/^\d\+\s—搜索第一个匹配项
ciw0——将光标下的单词替换为“0”
哟,是的
:g//norm viwp^Ayiw
--对于与上次搜索模式匹配的每一行,
--用复制的文本替换当前单词,
--增加它,
--复制新值。
(
只是Esc。^A
输入为Ctrl+V,Ctrl+A)
——更改内部单词李>ciw
——全局搜索李>:g
——选择内部单词李>viw
--粘贴(替换选择)p
——增量李>^A
——猛拉内部单词李>yiw
:let i=1
:g/^\d\+/s//\=i/|let i=i+1
概述
设置一些变量(让i=1
)用作计数器。在以数字(:g/^\d\+/
)开头的每一行上,我们执行一个替换(:s/\=i/
)以我们的计数器(\=i
)替换模式,然后递增我们的计数器(让i=i+1
)
为什么要使用:g
?为什么不干脆:s
?
您可以只使用替换命令来执行此操作,但是子替换表达式,\=
,需要一个表达式来计算值(请参见:h子替换表达式
)。由于让i=i+1
是一条语句,因此它将不会有用
有几种方法可以解决此问题:
- 创建一个递增变量然后返回它的函数
- 改为使用数组,然后更改数组中的数字(就地),然后从数组中返回值。e、 g.
map(arr,'v:val+1')[0]
- 如果每行只有1个替换,则从上面执行
技巧:g
:let i=[1]
:%s/^\d\+/\=map(i,'v:val+1')[0]
就我个人而言,我会用你能记住的任何方法
更多帮助
请执行以下操作:
:let i=1
:g/^\d\+/s//\=i/|let i=i+1
概述
设置一些变量(让i=1
)用作计数器。在以数字(:g/^\d\+/
)开头的每一行上,我们执行一个替换(:s/\=i/
)以我们的计数器(\=i
)替换模式,然后递增我们的计数器(让i=i+1
)
为什么要使用:g
?为什么不干脆:s
?
您可以只使用替换命令来执行此操作,但是子替换表达式,\=
,需要一个表达式来计算值(请参见:h子替换表达式
)。由于让i=i+1
是一条语句,因此它将不会有用
有几种方法可以解决此问题:
- 创建一个递增变量然后返回它的函数
- 改为使用数组,然后更改数组中的数字(就地),然后从数组中返回值。e、 g.
map(arr,'v:val+1')[0]
- 如果每行只有1个替换,则从上面执行
技巧:g
:let i=[1]
:%s/^\d\+/\=map(i,'v:val+1')[0]
就我个人而言,我会用你能记住的任何方法
更多帮助
使用:g技巧非常有效,谢谢。我不得不把它改成:17,$g。。。在我的文件中,因为我的标题中有几行是以数字开头的,我不想修改,但我显然没有在提示中包含这一行。谢谢。使用:g技巧非常有效,谢谢。我不得不把它改成:17,$g。。。在我的文件中,因为我的标题中有几行是以数字开头的,我不想修改,但我显然没有在提示中包含这一行。谢谢,很好用。我没有在我的帖子中提到这一点,但我的标题中有一些行我不想修改,但将范围(0,…)更改为从我的数据开始可以很好地修复它。谢谢,很好用。我没有在我的帖子中提到这一点,但我的标题中有一些行我不想修改,但将范围(0,…)更改为从我的数据开始可以很好地修复它。谢谢