【问题标题】:Replace while keeping certain "words" in vi/vim在 vi/vim 中保留某些“单词”的同时替换
【发布时间】:2012-07-22 09:00:54
【问题描述】:

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

通过使用这个:

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

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

【问题讨论】:

    标签: regex vim replace vi


    【解决方案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次也可以80@q

    替代(:规范)

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

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

    有关更有效地使用 :norm 的论述,请阅读 :help :normthis reddit post

    【讨论】:

    • 这对我很有用,谢谢!但由于某种原因,我总是必须对整个文件执行“.,$”而不是“%s”。这是我的 vim 安装的怪癖吗?
    • 可能,但请注意:.,$:% 不同。前者从 current 行到结尾,而后者则执行每一行。另一种选择是:0,$
    【解决方案2】:

    尝试使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2019-05-23
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2010-10-21
      相关资源
      最近更新 更多