4

これら2つのvimコマンドを検討してください

  1. :% s/one/two/g
  2. :% g/found/d

gグローバルな置換と削除のシグナリングをそれぞれ最後に置換し、最初に削除する必要があるのはなぜだろうか。

これらは私が見逃しているパターンに従っていますか、それともこれはvimのコーナーケースですか?

4

3 に答える 3

8

:g[lobal]:s[ubstitute]と混同していると思います:[range]delete

いくつかの例を作りましょう:

gフラグです:s:

  • :s/foo/bar/:現在の行の最初 fooの 部分だけを置き換えますbar
  • :s/foo/bar/g:現在の行のすべて fooを 置き換えますbar
  • %:s/foo/bar/ :ファイル全体の各行について、最初 fooの行のみをbar
  • %:s/foo/bar/g:ファイル全体(すべての行)ですべて fooを 置き換えますbar

:gas :globalcommand ::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: これは機能しません。2 つの範囲 (% と /foo/) があるため
  • :/foo/dg: これもうまくいきません。dgコマンドなし
  • :g/foo/d:g:これは上記(セクション)と同じように機能しますが、:globalコマンドからです

少しはっきりしていただければ幸いです。(またはもっと混乱? 私は願っていません.. ^_^)

あなたは以下を見てみたいかもしれません

:h :s
:h :g
:h :d
:h range
于 2013-03-11T00:05:48.753 に答える
3

少し違った説明をするには:

:% g/found/d

ここでは、 :g[lobal]gの短縮形であり、次の形式になっています。

:[range]g/pattern/[command]

そして、それは次のように機能します:

  1. 範囲内の各行をスキャンします[range](no[range]が指定されている場合、すべての行がスキャンされます)。
  2. 一致するすべてをマークしpattern
  3. 指定されたを実行し[command]ます。

注:pattern内で一致するすべての出現箇所は、 を実行する前に[range]マークされます。コマンドは、一致する とマークされたものだけが実行されます。[command]pattern

:% s/one/two/g

これはfrom :s[ubstitution]コマンドのg1 つで、次の形式です。[flags]

:[range]s[ubstitute]/pattern/string/[flags]

そして、それは次のように機能します:

  1. 範囲内の各行をスキャンします[range](no[range]が指定されている場合、現在の行のみがスキャンされます)。
  2. すべて一致するマーキングpattern
  3. pattern上記の 2 つの条件から見つかったものを に置き換えstring
  4. 呼び出し[flags]ます (たとえば、確認の場合は "c"、すべての出現の場合は "g")。

注:gこれはローカライズされたフラグであり、コマンドとは異なり、他のコマンドで普遍的:s[ubstitution]に使用されるわけではありません。:g[lobal]

:g[lobal]:s[ubstitute]の併用

command をに置き換える[command]と、次の形式になります。:g[lobal]:s[ubstitution]

:[range_g]g/pattern_g/[range_s]s/pattern_s/string_s/[flags]

分析することで、次のことがわかります。

  1. pattern_g私たちの世界は内のマッチングに限られています[range_g]
  2. この限られた世界の中で、私たちはコマンドを実行してい:s[ubstitute]ます。
  3. これ:s[ubstitute]は、 内で一致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

ケース 1::g/com/d

// all lines are deleted

ケース 2::g/com$/d

stackoverflow.com/
stackoverflow.com/
// all lines containting com at the end are deleted

ケース 3::g/com$/s/exchange/overflow/g

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

ケース 4::1,7g/com$/s/exchange/overflow/g

stackoverflow.com/
stackexchange.com/
stackoverflow.com 
stackoverflow.com // changed
www.stackoverflow.com
www.stackoverflow.com // changed
http://www.stackoverflow.com
http://www.stackoverflow.com

ケース 5::1,7g/com$/4,6s/exchange/overflow/

stackoverflow.com/
stackexchange.com/
stackoverflow.com 
stackoverflow.com // changed
www.stackoverflow.com
www.stackexchange.com
http://www.stackoverflow.com
http://www.stackoverflow.com

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

stackoverflow.com/
stackexchange.com/
stackoverflow.com 
stackoverflow.com // changed
www.stackoverflow.com
www.stackexchange.com // changed 
http://www.stackoverflow.com
http://www.stackexchange.com

ケース 7::s/exchange/overflow/g

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 
于 2013-03-11T02:51:43.823 に答える
1

s//gは、回線上のグローバル置換です。 g/ドキュメントのグローバル置換です。最初のケースで%sは、文書全体を置換します。最後に がなくgても、ドキュメント全体で置換が行われますが、各行の最初のインスタンスでのみ行われます。 %/は無効な構文ですが、現在の行を置き換える://d方法と同様に、見つかった次の行を置き換えます。:s//は必要ないことに注意してください%ggあなたの例では、同じことを行います。

于 2013-03-10T23:41:19.860 に答える