vim全球运营的一致性

时间:2013-03-10 23:35:51

标签: vim sed

考虑这两个vim命令

  1. :% s/one/two/g
  2. :% g/found/d
  3. 我想知道为什么g信令全局替换和删除分别需要在替换时和删除开始时放在最后。

    这些是否遵循我错过的模式,或者这是一个vim角落案例?

3 个答案:

答案 0 :(得分:8)

我猜您对:g[lobal]:s[ubstitute]:[range]delete

感到困惑

让我们举个例子:

g:s标记

  • :s/foo/bar/:在当前行中仅替换第一个 foobar
  • :s/foo/bar/g:将所有 foo替换为当前行中的bar
  • %:s/foo/bar/:对于整个文件中的每一行,仅将第一个 foo替换为bar
  • %:s/foo/bar/g:将所有 foo替换为整个文件中的bar (所有行)

:g :global命令:g可以执行任何命令,而不仅仅是d

  • :g/foo/d:删除所有匹配的行,默认范围为%
  • :%g/foo/d:与上述相同
  • :1,30g/foo/d:从第1-30行开始,删除包含foo
  • 的所有行
  • :g/foo/normal >>:缩进与foo匹配的所有行(不仅适用于d
  • :g/foo/y A:将所有匹配的(/foo/)行标记为a(不仅适用于d

:d命令:(:[range]d[elete]

  • :/foo/d/foo/这是一个范围。删除下一个匹配的行
  • :%d:删除所有行(清空文件)
  • :%/foo/d:这不起作用。因为你有两个范围(%和/ foo /)
  • :/foo/dg:这也行不通。没有dg命令
  • :g/foo/d:这是有效的,与上面相同(:g部分),但它来自:global命令

我希望你能清楚一点。 (或者更混乱?我希望不会...... ^ _ ^)

你可能想看看以下

:h :s
:h :g
:h :d
:h range

答案 1 :(得分:3)

解释一点:

:% g/found/d

此处,g:g[lobal]的缩写形式,其格式如下:

:[range]g/pattern/[command]

它的工作原理是:

  1. 扫描[range]中的每一行(如果未指定[range],则扫描所有行),
  2. 标记所有匹配的pattern
  3. 执行给定的[command]
  4. 注意:在pattern执行[range]之前,[command]内所有匹配的pattern都标记为。仅执行标记匹配:% s/one/two/g

    的命令

    g

    此处,[flags]是来自:s[ubstitution]命令的:[range]s[ubstitute]/pattern/string/[flags] 之一,其格式如下:

    [range]

    它的工作原理是:

    1. 扫描[range]中的每一行(如果未指定pattern,则仅扫描当前行),
    2. 标记所有匹配的pattern
    3. string
    4. 替换上述两个条件中找到的[flags]
    5. 致电g(例如“c”表示确认,“g”表示所有事件)。
    6. 注意::s[ubstitution]这里是:g[lobal]本地化标志,而不是{em>通用与其他命令一起使用,与:g[lobal]命令不同

      一起使用:s[ubstitute][command]

      使用:g[lobal]:s[ubstitution]命令替换:[range_g]g/pattern_g/[range_s]s/pattern_s/string_s/[flags] ,我们得到以下格式:

      pattern_g

      通过分析,我们了解到以下内容:

      1. 我们的世界仅限于[range_g]内的匹配:s[ubstitute]
      2. 在这个有限的世界中,我们正在执行命令:s[ubstitute]
      3. 只有在pattern_s内匹配[range_s]时才会执行此stackoverflow.com/ stackexchange.com/ stackoverflow.com stackexchange.com www.stackoverflow.com www.stackexchange.com http://www.stackoverflow.com http://www.stackexchange.com // your cursor is placed here
      4. 实施例

        给出以下文字:

        :g/com/d

        案例1:// all lines are deleted

        :g/com$/d

        案例2:stackoverflow.com/ stackoverflow.com/ // all lines containting com at the end are deleted

        :g/com$/s/exchange/overflow/g

        案例3:stackoverflow.com/ stackexchange.com/ stackoverflow.com stackoverflow.com // changed www.stackoverflow.com www.stackoverflow.com // changed http://www.stackoverflow.com http://www.stackoverflow.com // changed

        :1,7g/com$/s/exchange/overflow/g

        案例4:stackoverflow.com/ stackexchange.com/ stackoverflow.com stackoverflow.com // changed www.stackoverflow.com www.stackoverflow.com // changed http://www.stackoverflow.com http://www.stackoverflow.com

        :1,7g/com$/4,6s/exchange/overflow/

        案例5:stackoverflow.com/ stackexchange.com/ stackoverflow.com stackoverflow.com // changed www.stackoverflow.com www.stackexchange.com http://www.stackoverflow.com http://www.stackoverflow.com

        :1,7g/com$/4,6s/exchange/overflow/g

        案例6:stackoverflow.com/ stackexchange.com/ stackoverflow.com stackoverflow.com // changed www.stackoverflow.com www.stackexchange.com // changed http://www.stackoverflow.com http://www.stackexchange.com

        :s/exchange/overflow/g

        案例7:stackoverflow.com/ stackexchange.com/ stackoverflow.com stackexchange.com www.stackoverflow.com www.stackexchange.com http://www.stackoverflow.com http://www.stackoverflow.com // changed. only current line is executed

        {{1}}

答案 2 :(得分:1)

s//g是该行的全球替代品。 g/是该文档的全局替代品。在第一种情况下,%s会替换整个文档。如果最后没有g,它仍会对整个文档执行替换,但仅在每行的第一个实例上执行替换。 %/语法无效,但://d将替换下一行,其中:s//将替换当前行。请注意,您不需要%g。在您的示例中,只需g即可执行相同操作。