在vi/vim中进行替换时保留特定“单词”

8
例如,如果我有$asd['word_123']并且我想要用$this->line('word_123')替换它,保留'word_123'。我应该怎么做呢?
可以使用以下内容:
%s/asd\[\'.*\'\]/this->line('.*')/g

我无法保留它们之间的措辞,请给我指点。

2个回答

24

使用正则表达式,可以像这样做::%s/\$asd\['\([^']*\)'\]/$this->line('\1')/g

步骤:

%s - 替换整个文件

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

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

'\] - 完成我们的匹配。

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

g - 对每一行进行多次匹配。

替代方案(宏)

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

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

然后根据需要使用@q指令,您可以多次使用它。如果您在使用了@q一次后想要再次使用它,则可以使用@@,或者如果您想使用80次,则可以使用80@q

备选方案(:norm)

在某些情况下,使用:norm可能是最佳选择。例如,如果您有一个短的代码块,并且正在匹配唯一的字符或位置。如果您知道"$"只出现在"$asd"中的某个特定代码块中,您可以将其可视化选择并

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

如果想更有效地使用 :norm,请阅读 :help :norm这篇Reddit帖子


1
这对我很有效,谢谢!但出于某种原因,对于整个文件,我总是不得不使用“.,$”而不是“%s”。这是我的vim安装的问题吗? - NickO
潜在的可能性,但请注意 :.,$ 不同于 :%。前者从 当前 行到结尾,而后者则是每一行。另一种选择是 :0,$ - Conner

2

尝试使用

:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g

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