Sagar Jain
Sagar Jain

Reputation: 7941

Display all lines matching a pattern in vim

I search for a particular string in a file in vim, and I want all the lines with matching string to be displayed, perhaps in another vim window.

Currently I do this:

Search for 'string'

/string

and move to next matching string

n or N

Bur, I want all the lines with matching string at one place.

For example:

1 Here is a string

2 Nothing here

3 Here is the same string

I want lines 1 and 3 to be displayed as below, highlighting string

1 Here is a string

3 Here is the same string

Upvotes: 5

Views: 9596

Answers (3)

Max Barraclough
Max Barraclough

Reputation: 264

Following this answer over on the Vi StackExchange:

:v/mystring/d

This will remove all lines not containing mystring and will highlight mystring in the remaining lines.

Upvotes: 2

romainl
romainl

Reputation: 196466

:g/pattern/#<CR>

lists all the lines matching pattern. You can then do :23<CR> to jump to line 23.

:ilist pattern<CR>

is an alternative that filters out comments and works across includes.

The command below:

:vimgrep pattern %|cwindow<CR>

will use Vim's built-in grep-like functionality to search for pattern in the current file (%) and display the results in the quickfix window.

:grep pattern %|cwindow<CR>

does the same but uses an external program. Note that :grep and :vimgrep work with files, not buffers.

Reference:

:help :g
:help include-search
:help :vimgrep
:help :grep
:help :cwindow

FWIW, my plugin vim-qlist combines the features of :ilist and the quickfix window.

Upvotes: 10

Backlin
Backlin

Reputation: 14842

From the comments I believe your file looks like this, i.e. the line numbers are not part of the text:

Here is a string
Nothing here
Here is the same string

You could copy all lines matching a pattern into a named register ("a" in the example below), then paste it into a new file:

:g/string/y A
:e newfile
:"ap

Which gets you:

Here is a string
Here is the same string

Alternatively, you can use the grep command and add -n to include line numbers:

:grep -n string %
1:~/tmp.txt [text]                          line: 3 of 3, col: 23 (All)
:!grep -nH -n string /home/christofer/tmp.txt 2>&1| tee /tmp/vHg7GcV/3
[No write since last change]
/home/christofer/tmp.txt:1:Here is a string
/home/christofer/tmp.txt:3:Here is the same string
(1 of 2): Here is a string
Press ENTER or type command to continue

By default you'll get the output in the "command buffer" down at the bottom (don't know its proper name), but you can store it in several different places, using :copen for example.

Upvotes: 3

Related Questions