Vim从字符到行尾删除

时间:2016-05-18 08:06:51

标签: vim

我正试图想出一些东西,它会从给定角色开始删除所有文本到行尾。

E.g。在下面的示例中,我只想保留IP地址:

192.168.2.121/32 -m comment --comment "blah blah bye bye"  -j DROP
10.1.3.207 -m comment --comment "much longer comment with all kinds of stuff" -j DROP
172.16.1.0/24 -m comment --comment "Drop this range" -j DROP

要删除的模式是-m,即从左边读取,遇到第一个“ - ”。从“ - ”到行尾应该删除文件中的每一行。

我对此感到难过,我们将非常感谢指导。

6 个答案:

答案 0 :(得分:8)

全球指挥将是一个不错的选择

:g/-/norm nD

解释

:g         : Start a Global Command (:h :g for extra help on global commands)
/-         : Search for -
/norm nD   : Execute nD in Normal Mode where 
               n - jumps to the match
               D - delete to the end of the line

答案 1 :(得分:4)

这不是简单的:

:%s/-m.*//

或者我不明白这个问题对不对?

答案 2 :(得分:1)

我会注册一个宏,例如:

  1. 将光标放在位于0
  2. 的第一行
  3. ql开始在字母l
  4. 上注册一个宏
  5. t-D+
  6. q结束宏
  7. 根据需要多次启动宏,例如:3@l启动它三次
  8. t-D+的解释:

    • t--
    • 的下一个出现之前
    • D删除至结束
    • +,跳转到字符串开头的下一行,以便我们可以链接宏(l也应该在vim上工作,因为你删除到最后)

    正如@ Nobe4所述,你也可以在一行注册宏(例如qlt-Dq),然后重复视觉选择:VG:normal!@l

答案 3 :(得分:1)

I would do:

:%norm f D

"On each line, move the cursor to the first space and cut everything from the cursor to the end of the line."

:help range
:help :normal
:help f
:help D

答案 4 :(得分:0)

使用可视模式选择文本,然后使用:

:'<,'>s/\([^- ]*\).*/\1/

分解:

:'<,'>s/     " start a substitution on current selected lines
\([^- ]*\)   " capture a groupe of everything except a space and a -
.*/          " match the rest of the line
\1/          " replace by only the matched group

答案 5 :(得分:0)

在正常模式下有一个简单的方法:

  1. /-m让光标移动到第一次出现&#34; -m&#34;在文件中。
  2. d$删除光标到行尾的字符。
  3. n找到另一个&#34; -m&#34;。
  4. .重做第2步。