Vim delete starting from character to end of line

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.

6 Answers

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
4

There's a simple method to do that under the normal mode:

  1. /-m to let the cursor move to the first occurrence "-m" in the file.
  2. Press d$ to delete characters from the cursor to the end of the line.
  3. Press n to find another "-m".
  4. Press . to redo step 2.

Isn't this as simple as:

:%s/-m.*//

?

Or I didn't understand the problem right?

3

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

I would register a macro, for example:

  1. Put the cursor on the first line, at position 0
  2. ql start registering a macro on the letter l
  3. t-D+
  4. q end the macro
  5. Launch the macro as many times as you want eg: 3@l to launch it three times

Explanation 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.

5

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like