8

サンプル入力ファイル

+--------------------+---------+---------
|           Name     |   S1    |    S2
+--------------------+---------+---------
|           A        | -4.703  | -2.378  
|           B        | -3283.2 | -3204.5 
|           C        |  8779   |  7302   
|           D        |  22078  |  18018  
+--------------------+---------+---------

S1カラムを取り外す必要があります。

必要な出力

+--------------------+---------
|           Name     |   S2    
+--------------------+---------
|           A        | -2.378    
|           B        | -3205.5  
|           C        |  7302      
|           D        |  18018    
+--------------------+---------

誰でもこれを手伝ってもらえますか

ありがとう

4

5 に答える 5

4

見て、ma:視覚(ブロック)モードなし!

私の実用的なアプローチの勝利は次のようになります:列アンカーを探す(-+-

/-+-

これで、列の削除は次のように簡単になります。

d<C-v>N

(ブロックごとに、ドキュメントの最後から次に出現する列アンカーまで削除します)。

仕事は終わりました。


ファンシーオプション

複数の列を考慮するには、一致する列を正確に指定する必要があります

これには少し余分なものが必要です

0f+
:exec '/\%' . col('.') . 'v\v[+|]'Enter
NC-vN
t+d

\%22v仮想列を選択するこの方法の詳細については、を参照してください。

于 2012-05-09T16:05:32.067 に答える
3

コマンドモードの場合:

:%s/^\([[+|][^+|]\+\)[+|][^+|]\+/\1/

これは、vimの組み込みのsedのような検索および置換コマンドを使用します。内訳は次のとおりです。

%-ファイル全体

s- 検索する

/^-行頭

\([[+|][^+|]\+\)-その後に+or続き、その後にor以外の|任意の数(\+)が続きます。これにより、保持したい最初の列が取得されるので、それをとで囲んでキャプチャグループに入れます。 +|\(\)

[+|][^+|]\+-その後に+or続き、その後にor以外の|任意の数(\+)が続きます。これにより、保持したくない2番目の列が取得されるため、キャプチャグループはありません。 +|

/\1/-最初のキャプチャグループ(最初の列を含む)と一致したものをすべて置き換えます。これにより、1番目と2番目の列が最初の列の内容に効果的に置き換えられます。

私が言ったように、vimの正規表現はsedとほとんど同じなので、sedに関するこのチュートリアルを見ると、vimにも役立つものがたくさんあるはずです。

編集

これをより一般的に任意の列を削除できるようにするというOPの要求に応じて、次のようになります。

:%s/^\(\([[+|][^+|]\+\)\{1\}\)[+|][^+|]\+/\1/

内のインデックスは、\{\}示された列を削除するようになりました。配列インデックスのように考えてください(つまり、ゼロから始まります)。したがって\{0\}、最初の列を\{1\}削除し、2番目の列を削除します。

于 2012-05-09T11:14:30.273 に答える
3

すでに受け入れられている回答はありますが、ビジュアルモードがタスクの自然な方法であるため、 MathiasSchwarzのコメントを回答に書き込みたいと思います。

カーソルが¶にあると仮定します

+--------------------+¶--------+---------
| 名前| S1 | S2  
+ -------------------- + --------- + ---------
| A | -4.703 | -2.378  
| B | -3283.2 | -3204.5
| C | 8779 | 7302   
| D | 22078 | 18018  
+ -------------------- + --------- + ---------

通常のコマンドを使用して列Ctrl-V8jf+dを選択し、削除します。S1説明:

  • Ctrl-V:ブロックワイズビジュアルモードに入ります。
  • 8j:Eigthはテーブルの行数で、カーソルを同じ列の最後の行に設定します。
  • f ++ :カーソルを次の文字まで移動します。
  • d:視覚的選択を削除します。

そして結果は次のとおりです。

+--------------------+---------
|           Name     |    S2
+--------------------+---------
|           A        | -2.378  
|           B        | -3204.5 
|           C        |  7302   
|           D        |  18018  
+--------------------+---------
于 2012-05-09T12:50:09.147 に答える
2

これがファイルの唯一のコンテンツである場合、最も簡単な方法はこれを使用することです。

:%normal 22|d32|

ファイルにさらにテキストがある場合は、行間隔を指定します。

:X,Ynormal 22|d32|

ここで、XとYは行間隔です。次に例を示します。10,17normal 22|d32|

通常のコマンドと|に慣れていない場合 「モーション」には簡単な説明があります。

  1. このnormalコマンドは、通常モードで次のコマンドを実行します。
  2. | 「モーション」はカーソルを指定された列に22|移動するので、カーソルを22番目の列に移動します。

基本的に:X,Ynormal 22|d32|は、カーソルを22列目()に移動し、XとYで指定されたすべての行の32列目()までのすべて22|()を削除します。d32|

于 2012-05-09T17:08:43.123 に答える
0

テーブルのパターンに基づいて、これは2つの簡単なコマンドで実現できます。

:%norm 2f+dF+
:%norm 2f|dF|

2削除する列はどこにありますか( 11番目、3-3番目を削除します)。

これは以下のように機能します(一度に各行に対して):

  1. の2番目に対応する文字(2f+または2f|)。
  2. 列の次の文字dF+または)まで逆方向に削除しますdF|

2番目の列をインプレースで削除するコマンドラインアプローチは次のとおりです。

$ ex +'%norm 2f+dF+' +'%norm 2f|dF|' -scx cols2
于 2015-10-18T13:31:27.733 に答える