而在vi / vim中保持一定的“字”替换(Replace while keeping certai

2019-06-26 11:49发布

举例来说,如果我有$asd['word_123']我想用来替换$this->line('word_123')维持“word_123”。 我怎么能这样做?

通过使用这样的:

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

我将不能够保持措辞之间。 请赐教。

Answer 1:

使用正则表达式,你可以这样做:%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@q ,如果你想使用它的80倍。

替代(:标准)

在某些情况下,使用:norm可能是最好的选择。 举例来说,如果你有简短的代码块和你匹配一个独特的性格和位置。 如果你知道“$”只出现在“$ ASD”为一个特定的代码块,你可以直观地选择它,

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

有关使用话语:规范更有效,读:help :norm和这个reddit的职位 。



Answer 2:

尝试使用

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


文章来源: Replace while keeping certain “words” in vi/vim