regex 如何在一个命令中复制与模式匹配的行,并修改第二行?

wj8zmpe1  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(121)

我尝试用VIM作为编辑器给一个java类添加一个属性。因此我想我可以用一个命令来简化我的工作。例如:
所有包含"atributeA"的行,如以下行

this.attributeA=attributeA //basic constructor

应该变成

this.attributeA=attributeA //basic constructor
this.attributeB=attributeB //basic constructor

有可能吗?

kxkpmulp

kxkpmulp1#

要求解决方案是一行程序似乎有点奇怪,因为如果愿意,您可以在Vim中为按键分配任何击键序列或任何函数或命令。
话虽如此,这类事情是Vi的面包和黄油。

:g/attributeA/ copy . | s//attributeB/g

其中

:g/pattern/ command1 | command2 | ...

在与pattern匹配的每一行上执行命令(参见:help :global),

copy .

将与:g匹配的当前行(参见:help :copy)复制到地址.(表示当前行)之后,以及

s/pattern/replacement/g

然后在当前行执行一个替换(参见:help :substitute),也就是你刚刚做的拷贝。末尾的g标志导致对行中所有匹配的模式执行替换,而不仅仅是第一个。还要注意,我把搜索模式留空了:为了方便起见,Vim将记住上一个:global:substitute命令中使用的最后一个搜索模式。

2izufjch

2izufjch2#

您的精确样品很容易获得:

yy
p
:s/A/B/g

但是你完全有可能想要一些更一般的问题,如果是这样的话,你可能需要修改一下你的问题。

1yjd4xko

1yjd4xko3#

看看这个函数:

function AddAttribute()
    exe "/this.attributeA=attributeA;"
    exe "normal yyp"
    exe "s/attributeA/" . input('New attribute: ') . "/g"
endfunction

当你调用函数call AddAttribute()时,你会被提示输入一个新的属性,这个属性将像你的例子一样被添加,你可以用:map <F5> :call AddAttribute<CR>这样的东西绑定一个键,所以你只需按F5键就可以添加这一行。

编辑

如果你想复制所有带有attributeA的行(我觉得这没什么意义),你可以使用下面的Map(^M是CTRL + v,然后回车):

:map <F5> :call inputsave()\|let newAttribute=input('new attribute: ')\|:call inputrestore()\|:g/attributeA/exe "normal! yyp"\|exe ":s/attributeA/" . newAttribute . "/g"^M

按F5键时,系统将提示您输入新属性,并且包含attributeA的所有行都将被复制并替换为您的输入。

相关问题