Vim:用列表中的数字替换每行选择的第一个单词

Vim:用列表中的数字替换每行选择的第一个单词,vim,Vim,我有一个大文件,其中包含一个数字混乱的选择。它应该是一个序列1,2,3。。。但是有几行被搞乱了。我想改变一下 福 酒吧 1福巴 12345福巴 6546458福巴 4福巴 到 福 酒吧 1福巴 2福巴 3福巴 4福巴 我知道我可以使用类似于3,$的方法来选择我关心的行,以及put=range(11000)以我想要的数字开始创建新行,但我想将这些数字放在当前有数据的行上,而不是新行上。混乱的数字有几个字符长,但总是一个单词。谢谢。您可以使用以下功能: function Replace()

我有一个大文件,其中包含一个数字混乱的选择。它应该是一个序列1,2,3。。。但是有几行被搞乱了。我想改变一下

酒吧

1福巴

12345福巴

6546458福巴

4福巴

酒吧

1福巴

2福巴

3福巴

4福巴


我知道我可以使用类似于
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,…)更改为从我的数据开始可以很好地修复它。谢谢