8

例如,如果我有$asd['word_123']并且我想用 替换它$this->line('word_123'),则保留“word_123”。我怎么能那样做?

通过使用这个:

%s/asd\[\'.*\'\]/this->line('.*')/g

我将无法在两者之间保留措辞。请赐教。

4

2 回答 2

23

使用正则表达式,您可以执行类似的操作:%s/\$asd\['\([^']*\)'\]/$this->line('\1')/g

一步步:

%s- 替换整个文件

\$asd\['- 匹配“$asd['”。注意$and[需要转义,因为它们在正则表达式中具有特殊含义。

\([^']*\)-\( \)可用于选择所谓的“原子”,以便您可以在替换中使用它。[^']表示任何不是a 的东西',并且*表示匹配其中的 0 个或多个。

'\]- 完成我们的比赛。

$this->line('\1')- 替换为我们想要的,并\1替换为我们之前匹配的原子。

g- 对每行上的多个匹配项执行此操作。

替代品(宏观)

除了正则表达式,您还可以使用宏。例如,

qq/\$asd<Enter>ct'$this->line(<Esc>f]r)q

然后@q根据需要多次。你也可以@@在你用过@q一次之后,或者80@q如果你想用80次就可以。

替代(:规范)

在某些情况下,使用:norm可能是最好的选择。例如,如果您有一小段代码并且您正在匹配一个独特的字符或位置。如果您知道“$”只出现在特定代码块的“$asd”中,您可以直观地选择它并

:norm $T$ct'this->line(<C-v><Esc>f]r)<Enter>

有关更有效地使用 :norm 的讨论,请阅读:help :norm这篇reddit 帖子

于 2012-07-24T04:30:42.677 回答
2

尝试使用

:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g
于 2012-07-24T05:53:58.627 回答