20

これは簡単だと確信しています。1つか2つの文字が欠けているだけです。

ファイル内の特定の用語を検索する必要があり、それを見つけたら、その行に何かを追加する必要があります。そして、私は試合のすべての行に対してそれを行いたいと思います。

一度それをするために、私はこれをすることができます:

/Thing to find/s/$/ Stuff to append/

簡単。そして、私の「見つけるもの」が行の終わりにある場合、私はこれを行うことができます:

%s/\(Thing to find\)$/\1 Stuff to append/

すべての一致する行で同じことを行うには

しかし、どのようにすればすべての行で最初のことを行うことができますか?

私はできると思います

%s/\(Thing to find.*\)$/\1 Stuff to append/

しかし、それは不器用に感じられ、見つけるものが複数回並んでいると、より複雑になります。

どこでも最初の検索を行う方法があるはずだと思っていますが、グーグルで検索するのに十分な簡潔な説明を書くのに苦労しています。

だから強力なスタッカー、誰かが2バイトのソリューションで私をオタクに叩きたいですか?

4

3 に答える 3

42

コマンドは:g//あなたが探しているものです—それはパターンに一致する各行でコマンドを実行します:

:g/Thing to find/ s/$/ Stuff to append/
于 2013-01-08T14:10:40.680 に答える
3

前述のように、それ:g//はあなたが求めているものですが、特定のニーズに対するもう1つの効率は、グローバルの一部として通常のコマンドを実行することです。s取ることができるコマンドの束の1つにすぎませ:g//ん。またd(elete)、、、j(oin)およびほとんどすべてのexコマンドを想像することができます。

もう1つの便利なものはnorm(al)、です。これは、通常のコマンドを実行するために使用できます。以降:「コマンドは入力されたとおりに実行されます。:help:norm(al)

したがって、次の方法で目的を達成することもできます。

:g/Thing to find/norm Astuff to append

テスト環境用にmysql構成ファイルを複製しているとしましょう。「database=」で始まるすべての行に_testを追加したいので、次のようにします。

g/^database=/norm A_test

覚えておくべきことは、Vimは'norm'の後にすべてを入力したかのように実行するということです。したがって、Aコマンドと追加するテキストの間にスペースはありません(または出力に余分なスペースがあります)。

于 2019-11-17T23:18:03.317 に答える
1

:%s/green/bright &/g:ファイル内の各「緑」を「明るい緑」に置き換えます。

&:置換matched string。想像できることなら何でもできます。

フラグを使用できる\vので、多くのエスケープ文字を使用する必要はありません。

またはの--no-startup-id後にパラメータを追加しますexecexec_always

:%s/exec\(_always\)\?/& --no-startup-id/g

それを単純化する:

:%s/\vexec(_always)?/& --no-startup-id/g

于 2020-08-23T15:39:34.690 に答える