これら2つのvimコマンドを検討してください
:% s/one/two/g:% g/found/d
gグローバルな置換と削除のシグナリングをそれぞれ最後に置換し、最初に削除する必要があるのはなぜだろうか。
これらは私が見逃しているパターンに従っていますか、それともこれはvimのコーナーケースですか?
: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
少し違った説明をするには:
:% g/found/dここでは、 :g[lobal]gの短縮形であり、次の形式になっています。
:[range]g/pattern/[command]
そして、それは次のように機能します:
[range](no[range]が指定されている場合、すべての行がスキャンされます)。pattern、[command]ます。注:pattern内で一致するすべての出現箇所は、 を実行する前に[range]マークされます。コマンドは、一致する とマークされたものだけが実行されます。[command]pattern
:% s/one/two/gこれはfrom :s[ubstitution]コマンドのg1 つで、次の形式です。[flags]
:[range]s[ubstitute]/pattern/string/[flags]
そして、それは次のように機能します:
[range](no[range]が指定されている場合、現在の行のみがスキャンされます)。pattern、pattern上記の 2 つの条件から見つかったものを に置き換えstring、[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]
分析することで、次のことがわかります。
pattern_g私たちの世界は内のマッチングに限られています[range_g]。:s[ubstitute]ます。: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
s//gは、回線上のグローバル置換です。 g/ドキュメントのグローバル置換です。最初のケースで%sは、文書全体を置換します。最後に がなくgても、ドキュメント全体で置換が行われますが、各行の最初のインスタンスでのみ行われます。 %/は無効な構文ですが、現在の行を置き換える://d方法と同様に、見つかった次の行を置き換えます。:s//は必要ないことに注意してください%g。gあなたの例では、同じことを行います。