2012-05-17 86 views
6

我想刪除兩列之間所有行的內容。我該怎麼做呢?如何從兩列之間的所有行中刪除文本?

例如,我想這一點:

abcdefg 
hijklmn 
opqrstu 

要成爲這一點,如果我通過去除5列3之間的文本:在d

abfg 
himn 
optu 
+0

對於所有行,或只是當前行? – Jeremy

+0

對於所有行,我也想知道第80行到第90行 –

+0

我用一個例子更新了你的問題。你能確定它是準確的嗎?你關心的數字是無關緊要的。 – Jeremy

回答

15

將光標,然後按Ctrl-VlG and d

  • Ctrl-v進入視覺塊模式;
  • l將視覺選擇向右擴展一個字符;
  • G將選擇擴展到最後一行;
  • d刪除選擇。
+1

最好先做'G'然後'l',因爲如果'G'讓你在空行上,你可能必須重做'l'。 – Lumi

+0

不錯,但不幸的是,在vim 7.4.903+中,'G'將選擇擴展到文件底部和文件左側。因此在原始示例中,所有字符都將被移除到左側。相反,您需要使用'l'鍵確保突出顯示的區域是您想要移除的區域。 – timbo

4

對於自發編輯,我將通過CTRL-V(通常映射到Windows上的CTRL-Q)使用塊式視覺模式,然後d將其刪除。

如果你經常這樣做,對於一個大範圍/整個緩衝區,或者重複,我會使用一個在虛擬列中開始匹配的替換,並且向上延伸到最後一列,就像你的例子一樣:

%s/\%3v.*\%<7v// 
3

您可以使用搜索和替換:

:%s/..\zs...\ze 

或更一般的形式:

:%s/.\{2}\zs.\{3}\ze 

其中第一個數字(2)是該列的索引(基於零),第二個數字(3)是該列所具有的字符數。

說明:

:%s/搜索,並在整個緩衝區替換。

.\{2}\zs找到兩個字符並在此處設置匹配的開始。

.\{3}\ze找到三個字符並在此處設置匹配的結束。

由於要刪除匹配,因此省略替換字符串。

HTH

+0

您的解決方案是基於字符的,而不是基於列的。這對於雙寬度(例如中文)字符和不可打印字符(例如^ P(CTRL-P))有所不同。 –

+0

@IngoKarkat你是對的。我沒有讀完你的全部答案(我在閱讀CTRL-V後停止了)。 +1爲您的答案。 – Tassos

4

你提的問題是非常相似的this one

要刪除的列3至5爲所有行上的文件中:

:%normal 3|d6| 

爲了刪除一個特定的線的間隔(80〜90),使用:

:80,90normal 3|d6| 

如果您不熟悉普通命令和| | 「運動」有云的簡單說明:

  1. normal命令在正常模式中執行以下命令;
  2. The | 「運動」將光標移動到指定的列,所以3|將光標移動到第3列;
  3. 然後我刪除所有內容(d)直到第5列(6|)。
0

我會做下列方式:

:%s/^..\zs.*\ze..$//g 

將在開始刪除一切除了前兩列,兩底。

相關問題