Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

Vim delete starting from character to end of line

Writer Mia Lopez

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