我正试图想出一些东西,它会从给定角色开始删除所有文本到行尾。
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
,即从左边读取,遇到第一个“ - ”。从“ - ”到行尾应该删除文件中的每一行。
我对此感到难过,我们将非常感谢指导。
答案 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)
我会注册一个宏,例如:
0
ql
开始在字母l
t-D+
q
结束宏3@l
启动它三次 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)
在正常模式下有一个简单的方法:
/-m
让光标移动到第一次出现&#34; -m&#34;在文件中。d$
删除光标到行尾的字符。n
找到另一个&#34; -m&#34;。.
重做第2步。