apprentice454
apprentice454

Reputation: 431

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.

Upvotes: 17

Views: 41251

Answers (8)

Aleksandr Nokhrin
Aleksandr Nokhrin

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

wltz
wltz

Reputation: 669

  1. Move the cursor to the beginning of the line need to be removed.
  2. press key d twice to remove the line.

ref: https://alvinalexander.com/linux/vi-vim-delete-line-commands-to-end/

Upvotes: 0

CWLiu
CWLiu

Reputation: 4043

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.

Upvotes: 26

soyuka
soyuka

Reputation: 9105

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.

Upvotes: 1

Lieven Keersmaekers
Lieven Keersmaekers

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

romainl
romainl

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

Kent
Kent

Reputation: 195059

Isn't this as simple as:

:%s/-m.*//

?

Or I didn't understand the problem right?

Upvotes: 9

nobe4
nobe4

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

Related Questions