例如,如果我有$asd['word_123']
并且我想用$this->line('word_123')
替换它,请保留'word_123'。我怎么能这样做?
使用这个:
%s/asd\[\'.*\'\]/this->line('.*')/g
我无法保持两者之间的措辞。请赐教。
答案 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 :norm
和this reddit post。
答案 1 :(得分:1)
尝试使用
:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g