Reputation: 431
I'm trying to come up with something that will delete all text to end of line from a given character onwards.
E.g. in the example below I want to keep only the IP address:
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
The pattern to remove from is -m
, i.e., reading from left, the first "-" encountered. From that "-" to end-of-line should be deleted on every line in the file.
I'm stumped on this one, guidance would be appreciated.
Upvotes: 17
Views: 41251
Reputation: 11
shift-d
is another way to remove characters from current position to the end of the line.
Acts the same way as d$
does.
Literally, "from current position to the end of line, inclusive".
Upvotes: 1
Reputation: 669
d
twice to remove the line.ref: https://alvinalexander.com/linux/vi-vim-delete-line-commands-to-end/
Upvotes: 0
Reputation: 4043
There's a simple method to do that under the normal mode:
/-m
to let the cursor move to the first occurrence "-m" in the file.d$
to delete characters from the cursor to the end of the line.n
to find another "-m"..
to redo step 2.Upvotes: 26
Reputation: 9105
I would register a macro, for example:
0
ql
start registering a macro on the letter l
t-D+
q
end the macro3@l
to launch it three timesExplanation of t-D+
:
t-
goes in front of the next occurence of -
D
delete till end+
, jumps to the next line at the beginning of the string so that we can chain macros (l
should work too on vim as you deleted till the end)As @Nobe4 stated you can also register the macro on one line (eg qlt-Dq
) and then repeat on a visual selection: VG:normal!@l
.
Upvotes: 1
Reputation: 58441
A global command would be a good fit
:g/-/norm nD
Explanation
: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
Upvotes: 30
Reputation: 196546
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
Upvotes: 2
Reputation: 195059
Isn't this as simple as:
:%s/-m.*//
?
Or I didn't understand the problem right?
Upvotes: 9
Reputation: 2842
Select your text with visual mode and then use:
:'<,'>s/\([^- ]*\).*/\1/
Decomposition:
:'<,'>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
Upvotes: 0