使用Vim进行搜索替换并递增计数

4

我想要在这里的线程之后进行搜索和替换,但很遗憾它没有起作用。 gVim find/replace with counter

有人能帮帮我吗?

正在工作

:let n=[0] | %s/|-\n|/\=map(n,'v:val+1')/g

无法工作

:let n=[0] | %s/|-\n|/BLABLA\=map(n,'v:val+1')/g

为什么?如何隐藏函数?

示例:

{| class="wikitable"
! Number
! Name
! Type
! Default Value
! Duration
! Activation
! Status
! EDIT
|-
| 
| Adobe-Dummy-Cart-Total
| Custom Script
| 
| Pageview
| Active
| Approved
| Edit
|-
| 
| basePrice

I wana replace

|-
|

使用

标签

|-
| 1

|-
| 2
3个回答

2

:help sub-replace-expression (强调是我的)

如果替换字符串以 "\=" 开头,则其余部分将被解释为表达式。

你无法像你想的那样做;替换字符串要么是子表达式(当它以 \= 开头),要么是字面值(当它不以 \= 开头)。

相反,你需要重写子表达式以程序化地拼接字符串(:help expr-.):

最初的回答:

:let n=[0] | %s/|-\n|/\="BLABLA".map(n,'v:val+1')[0]/g

[0]map生成的数组内容是必要的,原因有两个:替换为一个数组将引入不必要的换行符,并且使字符串连接变得不可能。

然而,在您的示例中,如果除数字外没有引入任何字符串 - 即如果您不需要该空格(:help /\zs):

最初的回答是使用[0]来获取map生成的数组内容是必要的。这是因为如果用一个数组替换它会引入一个不必要的换行符,并且使字符串连接变得不可能。但是,在您的示例中,如果除了数字以外没有引入任何字符串,那么使用[0]可能就不是必要的。

:let n=[0] | %s/|-\n|\zs/\=map(n,'v:val+1')[0]/g

当然,你可以将两者结合起来,为你特定的情况提供完美的去湿解决方案:

最初的回答

:let n=[0] | %s/|-\n|\zs/\=" ".map(n,'v:val+1')[0]/g

+1,非常好的回答!谢谢!非常好的解释。那帮了我很多。谢谢。之后我进行了一些研究,并在这里找到了解释。 https://jeffkreeftmeijer.com/vim-reformat-dates/ - Hendrik
你得出了正确的结论,但是在开头提到 /\= 正则表达式多选项只会让人感到困惑和错误,因为这是在 替换 部分而不是 模式 部分。 - Ingo Karkat
@IngoKarkat 哦,天啊,你说得对...我一定是太累了,竟然把它们两个搞混了,哈哈...谢谢你提醒我。 - Amadan
周一早上工作过度...哦,那太糟糕了!最好休整整个星期;-) - Ingo Karkat

2
当您使用:help sub-replace-expression时,整个替换必须是一个以\=开头的Vimscript表达式。您不能只是在替换文本前面添加(如BLABLA\=map(n,'v:val+1'))。请改用字符串连接。使用您的map方法的一个复杂之处在于,它返回一个列表而不是一个字符串,因此我们需要选择列表中唯一的(计数器)元素。要引用现有匹配的文本,请使用submatch(0)而不是\0&(或者避免在模式末尾使用\zs来引用)。
:let n=[0] | %s/|-\n|/\=submatch(0) . " " . map(n,'v:val+1')[0]/g

+1 对于详细的解释!你好Ingo,感谢你的好回答和详细的解释。现在我明白了这是什么意思。我一定会更深入地研究这个主题。 - Hendrik
啊,很高兴我能帮到你!请通过点击勾选标记来接受一个答案(你喜欢的那个)。这样,问题就会被标记为已关闭,并且你将增加未来问题得到答案的机会,因为这表明你关心答案。 - Ingo Karkat

0
使用\zs可以使解决方案更简单。
:let c=1 | g/^|-\n|\zs/ s//\=' '.c/g | let c+=1

^ ............ start of line
\n ........... line break
|  ........... vertical bar

我们正在将一个空格\=' '与计数器c连接起来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接