【发布时间】:2012-07-22 09:00:54
【问题描述】:
例如,如果我有 $asd['word_123'] 并且我想用 $this->line('word_123') 替换它,则保留“word_123”。我怎么能这样做?
通过使用这个:
%s/asd\[\'.*\'\]/this->line('.*')/g
我将无法保留两者之间的措辞。请赐教。
【问题讨论】:
例如,如果我有 $asd['word_123'] 并且我想用 $this->line('word_123') 替换它,则保留“word_123”。我怎么能这样做?
通过使用这个:
%s/asd\[\'.*\'\]/this->line('.*')/g
我将无法保留两者之间的措辞。请赐教。
【问题讨论】:
使用正则表达式,您可以执行:%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 可能是最佳选择。例如,如果您有一小段代码并且您正在匹配一个独特的字符或位置。如果您知道“$”只出现在“$asd”中的特定代码块,您可以直观地选择它并
:norm $T$ct'this->line(<C-v><Esc>f]r)<Enter>
有关更有效地使用 :norm 的论述,请阅读 :help :norm 和 this reddit post。
【讨论】:
:.,$ 与:% 不同。前者从 current 行到结尾,而后者则执行每一行。另一种选择是:0,$。
尝试使用
:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g
【讨论】: