viを使用してファイル内のすべての行を削除するにはどうすればよいですか?


269

viを使用してファイル内のすべての行を削除するにはどうすればよいですか?

現時点では、次のような方法でファイル内のすべての行を削除しています。

echo > test.txt

を使用してすべての行を削除するにはどうすればよいviですか?

注: を使用することddは適切なオプションではありません。多くの行がある場合があります。


5
dGは動作するはずです。
MadTux 14年

11
@MadTux、最初の行から開始する場合のみ。1GdGどこからでも動作します。
ホロウェイ

1
echo | test.txttest.txt実行可能なスクリプトでない限り、有効なコマンドではありません。echo >test.txt代わりにあなたが意味すると思いますか?
トリプリー14年

あなたは正しい@tripleee-
コールド

5
を使用しないとvi>test.txt長さをゼロに切り捨てるのに十分echoです-不要です。
14年

回答:


473

ではviDO

:1,$d

すべての行を削除します。

:コマンドを導入(および底部にカーソルを移動させます)。
これ1,$は、次のコマンド(d)が機能する行の指示です。この場合、1行目から最後の行までの範囲(で示される$ため、ドキュメントの行数を知る必要はありません)。
最後dは、指定された行を削除することを意味します。

短い形式(:%d)がありますが、使用していません。は:1,$d、たとえば:4,$-2d最初の3行と最後の2行のみを残し、残りを削除するなど、より簡単に「適応」できます。


9
プロのヒント。これ以上ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 .次回コマンドを繰り返す
Gazihan Alankus

169

viでは

:%d

どこ

  • : コマンドモードで実行するようにviに指示します
  • % すべての行を意味します
  • d :削除

コマンドラインで、

> test.txt

また行います。

ddの問題は何ですか?

dd if=/dev/null of=test.txt

どこ

  • /dev/null 特別な0バイトのファイルです
  • if 入力ファイルです
  • of 出力ファイルです

私はddファイルのすべての行にペスが必要だと考えていました。
コールド

良い。それは私が予想以上に簡単です...
コールド

11
ddviコマンド(OPが意味するもの)とdd、例を示すユーティリティを区別する必要があります。また、> test.txt非bashシェル(zshなど)では期待どおりに動作しない場合があります。
14年

1
@depquidおっと!今私が考えてみると...
Archemar

2
または、: >test.txtこれは非常にわずかに長いだけです。
トリプリー14年

53

これを行うことをお勧めします(POSIX準拠のシェルで動作するはずです):

> test.txt

あなたが本当にviでそれをやりたいなら、あなたはすることができます:

  • 1G(最初の行に移動)
  • dG(最終行まで削除)

30
@Cold:...一度だけ?
クリスダウン

5
G最後の行を表します。最初の行(gg)にdGいる場合、現在の行(最初の行)から最後の行までのすべての行を削除するようにviに指示します。だから、あなたはワンショットでそれを行います。
unxnut 14年

6
ggvim固有です。それはだ1G伝統的なviの中で。
ステファンシャゼル14年

1
シェル構文は、一部のシェルの構成に依存しています。bashとzsh(デフォルトではzsh)の両方のインタラクティブシェルは、そのコマンドを受け取った後、STDINでの入力を待つことができ、実際にファイルをクリアするには追加の<CTRL> + Dが必要です。実行する機能は、CLOBBER設定にも依存します。>| test.txt < /dev/null常にファイルを上書きし、対話型端末での入力待ちを回避するため、やや堅牢です。
カレブ14年

1
@Caleb:私が言ったように、POSIX準拠のシェルで。:-)これらの2つの状況はいずれもPOSIXに準拠していません。
クリスダウン14年

28

カーソルが最初の行にある場合(そうでない場合は、:ggまたはを入力します1G)、そのまま使用できますdG。現在の行からファイルの最後までのすべての行を削除します。そのため、ファイルからすべての行を確実に削除するために、両方を一緒に混在させることができます。これは次のとおりですggdG(コマンドモードの場合)。

または%d、Exモードでは、コマンドラインの例:vim +%d foo.bar

関連:VIMで現在の行からファイルの終わりまでのすべてのテキストを削除するにはどうすればよいですか?


3
+1:$ dよりも人間工学的であるため。とにかく、私たちの指が常にコロンを入力するために配線されているわけではありません;)
アーロンR.

2
賛成。dG私がいつも使っているものです。
lunchmeat317 14年

1
私はこれggdGをvimで最も簡単な方法だと思います。この答えが他の人のように支持されggないのは、純粋なviには存在しないからですか?
thameera 14年

27

私は怠け者で、シンプルにしたいのです。ggdGを含む5つのキーストロークですShift

ggファイルの最初の行に移動しddelete動詞の始まりでGあり、ファイルの最後に移動する動きです。厳密には、ファイルの先頭に移動し、タイルの最後まですべてを削除します。


rsrs。私も怠け者で、使用する:$d:1,$d、より速い方法です(文字数を減らします)kkk
Cold 14年

3
:%d5つのキーストロークしか使用しないため、これは適切な代替手段です。
TankorSmash 14年

1
@TankorSmash ggvimコマンドであり、ではありませんvi
kyrias 14年

良いキャッチ、私の間違い
TankorSmash 14年


5

私はいつも使う ggVG

  • gg 現在の編集ファイルの先頭にジャンプします
  • V(大文字のv)は現在の行を選択します。この場合、現在の編集ファイルの最初の行
  • G(大文字のg)はファイルの最後にジャンプします。この場合、最初の行Gを選択したため、このファイルのテキスト全体が選択されます。

その後、単にdまたはxを押してすべての行を削除できます。


d垂直に使用する場合、自動的に行ごとに適用されます。たとえばdl、右の文字をdj削除し、下の行を削除します。
TankorSmash 14年

3

あなたの質問でecho > test.txtは、空のファイルではなく、単一の改行を含むファイルを作成することに注意してください。

シェルから、echo -n > test.txtまたはの使用を検討してください: > test.txt

通常はvi編集コマンドを使用します(私はを使用しますggdG)が、次のように現在のファイルへの参照を使用してシェルを呼び出すこともできます。

:!:>%

とほぼ同じくらい簡潔ですがggdG、入力するのが難しく、また、変更したファイルをリロードすることを確認する必要があるため、この場合は特にお勧めしませんが、このようにviからシェルコマンドを使用する方法を知っているのは有用。

分解する:

  • : viコマンドを開始する
  • ! シェルコマンドを初期化する
  • : これは、空の出力を持つシェル組み込みコマンドです
  • > 出力をリダイレクトする
  • % viはこれを現在のファイルの名前に置き換えます

提案された:1,$dものはもちろん良いものであり、私がそれにいる間もあります1GdG


:!:>%またvi、シェルのファイル名をエスケープしないため、危険です($(reboot)たとえば、呼び出されたファイルを編集するときはエスケープしないでください)。あなたは、何か必要があると思います:call system(":>" . shellescape(expand("%")))
ステファンChazelas

3

別の解決策:

truncate -s 0 file

本当に簡単ではありません>fileが、大丈夫です。
phk

1
良い方法のようですが、ターゲットはviを使用してそれを行っています。Tks
コールド


-1

トリックを使用して、大量の行を削除できます。挿入モードではないことを確認し(ESCを押します)、1000ddと入力します。


1
コマンドの機能/動作の説明を含める必要があります(次の1000行を削除ます。カーソルが最初の行にない場合、すべての行は削除されません)。
セバスト

これが私がそれをトリックと呼んだ理由です:)
ラドゥ

-1

gg行の先頭に到達するように入力してからを実行し100 ddます。これにより、ポインターがエディターの最上行に移動し、そこから100行が消去されます。ファイルが長い場合は、行を追加するために番号を調整する必要があります。


-1
> file.txt

本当に開きたくない限り、viを開く必要さえありません。


1
こんにちは、U&Lスタック交換サイトへようこそ。このサイトの最適な投稿方法については、ヘルプセンターをご覧ください。このサイトでは、有益でユニークな質問と回答を増やしたいと考えています。あなたの答えは、この投稿の他の答えやコメントと同じです。してください編集よりユニークかつ有益な答えであるためにあなたの投稿をしてください。ありがとうございました!
ケモテプ

その上、問題のポイントは...「viを使用」
ジェフシャラー

私はあなたが提案したとおりにしようとしました。わかったbash: > file.txt: command not found
ロアイマ

@roaimaあなたが物事をとして引用すれば、あなたはそれを得るでしょう"> file.txt"
クサラナンダ

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