在vi/vim中保留某些"单词"时替换

Eri*_*c T 7 regex vi vim replace

例如,如果我有$asd['word_123'],我想用它替换它$this->line('word_123'),保留'word_123'.我怎么能这样做?

通过使用这个:

%s/asd\[\'.*\'\]/this->line('.*')/g
Run Code Online (Sandbox Code Playgroud)

我无法保持两者之间的措辞.请赐教.

Con*_*ner 20

使用正则表达式,你可以做类似的事情 :%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
Run Code Online (Sandbox Code Playgroud)

然后@q根据需要多次.您也可以@@使用@q一次,或者80@q如果您想使用它80次.

替代方案(:规范)

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

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

关于使用的话语:更有效的规范,阅读:help :norm这个reddit帖子.