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

时间:2012-07-24 04:27:11

标签: regex vim replace vi

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

使用这个:

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

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

2 个答案:

答案 0 :(得分: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

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

替代方案(:规范)

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

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

有关使用:更有效地使用规范的讨论,请阅读:help :normthis reddit post

答案 1 :(得分:1)

尝试使用

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