web-dev-qa-db-ja.com

Vimの最初の2列を囲む引用符を削除するにはどうすればよいですか?

テキストファイルに次のスタイルの行があるとします。

"12" "34" "some text     "
"56" "78" "some more text"
.
.
.
etc.

最初の2列を囲む引用符を削除できるようにしたい。 Vimでこれを行うための最良の方法は何ですか(私は現在gVimを使用しています)?

ビジュアルモードを使用して、少なくとも各行の最初の引用符を削除し、コマンド'<,'>s!^"!!を入力する方法を見つけました。

テキストの列全体を選択する方法があるかどうか疑問に思っています(1文字がファイルをまっすぐ下に行く...または1つ以上ですが、この場合は1つだけが必要です)。可能であれば、あなたは適用することができますか? x 列全体にコマンド(文字を削除)します。

それを行うためのより良い方法があるかもしれません。私は何か提案を探しています。


更新

ちょうどそして参考までに、私はいくつかの提案を組み合わせました。私の_vimrcファイルには次の行が含まれています。

let @q=':%s/"\([0-9]*\)"/\1/g^M'   

(注:^Mは CTRLQEnter コマンドの実行後にEnterキーを押すことをエミュレートするには)

これで、を介してマクロを使用できます @q ファイルの両方の数値列からすべての引用符を削除します。

15
Jason Down

Control-Vはブロック選択に使用されます。これにより、同じ文字列で物事を選択できるようになります。

数字の周りの引用符を削除したいようです。その使用のために、

:%s/"\([0-9]*\)"/\1/g

これが vimでできるパターンのリスト です。


1行あたり4回の置換に制限されるもう1つの(醜い)フォームがあります。

:%s/^\( *\)"\([ 0-9]*\)"\([ 0-9]*\)"\([ 0-9]*\)"/\1\2\3\4/g

また、sedが手元にある場合は、シェルからこれらを試すこともできます。

head -4 filename.txt | sed 's/pattern/replacement/g'

これにより、ファイルの最初の4行でコマンドが試行されます。

18
nik

ビジュアルブロックコマンドを使用します。

  • ctrl-vでモードを開始
  • モーションを指定します。例: G(ファイルの最後まで)、または上/下キーを使用
  • 選択したブロックに対して、アクションを指定します。例:削除する場合は「d」

詳細については、:hvisual-modeを参照してください。

28
Fritz G. Mehner

最初の列以外のすべての列を削除したい場合、簡単で簡単な方法はこれをVimに入力することです。

:%!awk '{print $1}'

または、最初の列以外のすべての列が必要な場合は、次のようにすることもできます。

:%!awk '{$1="";$0=$0;$1=$1;print}'

確かに、クエストを実行するには外部ツールが必要ですが、awkはデフォルトでLinuxとMacにインストールされており、UNIXライクなシステム経験のない人はWindowsでVimを使用することはめったにないと思います。そうでなければ、Windowsバージョンのawkを入手する方法を知っているでしょう。 。

4
Meow

このケースは正規表現で修正するのは非常に簡単でしたが、もう少し高度なことをしたい場合は、BryanWardのようなマクロを記録することもお勧めします。また、vimの正規表現でどの文字をエスケープする必要があるかを覚えるよりも、マクロの方が簡単です。また、マクロは、変更がすぐに行われ、一度に小さなビットで行変換を処理できるので便利です。

したがって、あなたの場合は、qwを押して、レジスタwにマクロの記録を開始します(もちろん、任意の文字を使用できます)。私は通常、マクロを^で開始して行の先頭に移動し、マクロがカーソルの位置に依存しないようにします。次に、f "を実行して最初の"にジャンプし、xを実行してそれを削除し、f "を実行して次の"にジャンプし、xを実行してそれも削除できます。次にqで録音を終了します。

マクロを次の行で終了させる代わりに、実際には今日遅くまで、マクロを適用するすべての行をV(視覚的に行選択)して、レジスタwのマクロを適用する:normal @ wを実行できます。視覚的に選択された各行。

3
Sam

vimでの列編集 を参照してください。列の挿入について説明していますが、基本的には削除と同じように機能するはずです。

3
wazoox
  1. ビジュアルブロックを開始する Ctrl+v
  2. 最後にジャンプし、次を押して最初の2列を選択します。 G、 EE
  3. 次のように入力します::s/\%V"//gこれにより、次のコマンドが実行されます。

    :'<,'>s/\%V"//g
    

    押す Enter これにより、選択したブロック内のすべての"オカレンスが削除されます。

参照: ビジュアルブロックへの代替の適用 Vim Wikia

1
kenorb

引用符を削除してから次の行にドロップダウンするマクロ(q)を作成することもできます。次に、viに何回実行するかを指示することで、何回も実行できます。したがって、文字mを言うようにマクロを保存すると、100 @ mを実行でき、100行の引用符が削除されます。マクロの詳細については、以下をご覧ください。

http://vim.wikia.com/wiki/Macros

1
Bryan Ward

他の解決策は良いです。試すこともできます...

:1,$s/^"\(\w\+\)"/\1/gc

Vim正規表現のヘルプの詳細については、 http://vim.wikia.com/wiki/Search_patterns も参照してください。

1
kervin