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帖子.