これら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
:g
as :global
command ::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]コマンドのg
1 つで、次の形式です。[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
あなたの例では、同じことを行います。