例如,如果我有$asd['word_123']
并且我想用 替换它$this->line('word_123')
,则保留“word_123”。我怎么能那样做?
通过使用这个:
%s/asd\[\'.*\'\]/this->line('.*')/g
我将无法在两者之间保留措辞。请赐教。
使用正则表达式,您可以执行类似的操作:%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 帖子。
尝试使用
:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g