Vimの各行の末尾に文字列を追加するにはどうすればよいですか?


回答:


354

:%s/$/\*/g

うまくいくはずです。そうすべきである:%s/$/*/gとしてMrWigglesが正しく指摘しています。


すべての行が同じ長さではないため、同じ列にを挿入する方法はありますか。したがって、行1の 15列目は ' 'ですが、行2の25列目は '*'です。
Aman Jain

11
EOLは1行に1つしかないため、gフラグは不要です。
doubleDown 2013年

各行の先頭に/を追加したかった:1、$ s / ^ / \ / gがうまくいった。
farooqsadiq 2013

@dirkgentlyこのコマンドに引数として文字列変数を渡すにはどうすればよいですか(*の代わりに)。
Matheus Rotta 2017

353

:searchコマンドよりもさらに短い:

:%norm A*

これが意味するところは:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
男、私が何かを学ばないviまたはvimスレッドは存在しません。今日、私は規範について学びます。そして、彼らが乾杯で言うように、「ノルム!」
smcameron 2009年

4
前に付ける場合は、0i *を使用するだけで、0は行の先頭に移動し、iは挿入モード、*は*に移動します。D:
Rob

7
VimGolferとして私は1つのキーストロークを節約するのI*ではなく、それを使用して追加せざるを得ません0i*
Jedidiah Hurt、2011

24
もう1つのヒント:これは範囲でも機能します。ビジュアルモードで行を強調表示してを押すだけです:。これにより、次のコマンドを事前に入力:'<,'>できます:'<,'>norm A*
Jedidiah Hurt

8
前に追加するには、I代わりに使用します:%norm I*
Just Lucky Really

42

また:

:g/$/norm A*

また:

gg<Ctrl-v>G$A*<Esc>

Ahhh ... 2つ目は、行を選択して使用することもできます。いいね!
Tim Fletcher

最初の例を説明していただけますか?
Cody Poll 2015年

@CodyPoll gglobal、一致するすべての行で何かを実行するコマンドです。$すべての行に一致します。^またはかもしれません.*。normは、コマンドモードで通常使用するコマンドを実行します。つまり、行末にA*追加*することを意味します。
2016

41

私は、ビジュアルブロックモードを使用する方が、この種のことを処理するためのより優れた、より用途の広い方法だと思います。次に例を示します。

This is the First line.  
This is the second.  
The third.

「Hello world」を挿入します。(スペース+クリップボード)これらの各行の終わり:

  • 1行目の文字で、Ctrl-V(またはCtrl-Vが貼り付けられている場合はCtrl-Q)を押します。
  • jjを押して、ビジュアルブロックを3行に拡張します。
  • $を押して、ビジュアルブロックを各行の終わりまで延長します。A、スペースの順に押してから、Hello worldと入力します。+次にEsc

結果は次のとおりです。

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

Vim.Wikia.comの例)


3
押す代わりに、最後の行に移動するためにjjヒットGすることができます。これはj、最後の行に到達するまで押すのが現実的ではない大きなファイルで役立ちます。
2013年

視覚的なブロックがここで最もクリーンで、拡張性も高いことに同意します
Peter Dolan

これは、最初はすべての行で機能しているようには見えませんが、Escキーを押すと、すべての行に追加されます。
Noumenon

Visual Blockは、VSコードのような他のものの拡張としてvimを使用するときに問題とエラーを引き起こします。これらの場合、元のユーザーが求めている検索と置換は信頼できるオプションです。
Brettins

大文字のAを使用してください。小文字の「a」は機能しません。
Jeff Hoye

14

各行の終わりにHello worldを追加したい場合:

:%s/$/HelloWorld/

これを特定の行数に対して実行したい場合は、20から30までを使用します。

:20,30s/$/HelloWorld/

各行の先頭でこれを実行したい場合は、次を使用します。

:20,30s/^/HelloWorld/

6

g最後に本当に必要はありません。したがって、次のようになります。

:%s/$/*

または、単に*の最後にしたい場合は、14行目から18行目を言います。

:14,18s/$/*

または

:14,18norm A*


5

1つのオプションは次のとおりです。

:g/$/s//*

これは、すべての行の終了アンカーを見つけ、それをに置き換え*ます。私は「代用」と言いますが、実際にはアンカーは通常の文字ではなく特別なものであるため、それは追加の詳細です。詳細については、Power of g-Examplesを参照してください。


正規表現でs //はどういう意味ですか?同様のコマンド:g / / / p(grep)を知っています。あなたのコマンドは、少なくとも構造上、私のものに近いと確信しています。
レオ・レオポルド・ヘルツ준 영

1
sは代替です-行末のアンカーをアスタリスクに置き換えます(まあ、アンカーポイントなので実際には置き換えません)。
paxdiablo 2009

3
:%s / \ n / * \ r / g

あなたの最初のものはどこでも正しいですが、Vimは何らかの理由で異なる改行処理をしなければなりません。


私のバージョンのVimでは\ n機能しますが、これは改行を*に置き換えるだけで、行を効果的に結合します。
Nathan Fellman、

1
このコマンドは、試したVimのすべてのバージョンで正常に動作することが確認されています。あなたはWindowsバージョンか何かを使用していますか?

1
%s/\s*$/\*/g

これでうまくいき、先頭のスペースが無視されるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.