Using a discovery command utility I can grep the location of some directories, and I need to open containing files. I cannot use find with exec such as this example find . -name "*.txt" -exec vim {} +.

If I don't modify the grep output, xargs works as this

searchUtilityCommand | grep keyword | xargs vim

But I actually need

searchUtilityCommand | grep keyword | xargs -I % vim %/extra/path

However, when doing that it opens the first hit, and after I close it opens the second; close it and open the third... I tried using

searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path

But it just fails. I also tried

vim `searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path`

No luck.

I thought awk or sed could be used, but I am not fluent with them and I dont know if its worth it. It could be something like

searchUtilityCommand | grep keyword | <awk modify grepped path> | xargs vim

Any help.


2 Answers 2


Have not tested this, but no reason it should not work:

searchUtilityCommand | grep keyword | sed -e 's,$,/extra/path' | xargs vim

I have to say though, I don't know how to get rid of the "Warning: Input is not from a terminal" message that comes up when you run vim like this. (I generally prefer vim $(command pipeline) for that reason).

  • you where missing a comma at the end of sed regex. Works like a charm! thanks searchUtilityCommand | grep keyword | sed -e 's,$,/extra/path,' | xargs vim
    – manolius
    Oct 6, 2019 at 8:10

From Vim, run this Ex command:

:args `=systemlist('searchUtilityCommand | awk ''/keyword/{print $0 "/extra/path"}''')`

Or this one:

:args `=map(filter(systemlist('searchUtilityCommand'), {_,v -> v =~# 'keyword'}), {_,v -> v.'/extra/path'})`

This should populate the arglist with a list of file paths; the ones output by searchUtilityCommand, matching keyword, with /extra/path appended at the end.

From there you can do all sort of things, such as:

" open each file in a horizontal split (run `:only` to close all splits except the current one)

" open each file in a vertical split
:vert all

" open each file in a tab page (run `:tabonly` to close all tab pages except the current one)
:tab all

" diff all the files
:vert all | windo diffthis

" replace all occurrences of `pat` with `rep` in each file
:argdo %s/pat/rep/g | update

For more information, see:

:h `=
:h systemlist(
:h map(
:h filter(
:h :all
:h :argdo
  • I marked the other answer as the solution for coherence with the question title (for future records), which funnily enough says to prefer using vim commands. This answer has full of potential tips. Thank you!!
    – manolius
    Oct 6, 2019 at 8:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .