使用发现命令实用程序,我可以 grep 某些目录的位置,并且需要打开包含的文件。我无法将 find 与 exec 一起使用,例如这个例子 find . -name "*.txt" -exec vim {} +
。
如果我不修改 grep 输出,xargs 的工作方式如下
searchUtilityCommand | grep keyword | xargs vim
但我确实需要
searchUtilityCommand | grep keyword | xargs -I % vim %/extra/path
但是,这样做时它会打开第一个命中,在我关闭后它会打开第二个;关闭它并打开第三个...我尝试使用
searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path
但它就是失败了。我也试过了
vim `searchUtilityCommand | grep keyword | xargs -P 0 -I % vim %/extra/path`
没有运气。
我认为awk
可以sed
使用,但我对它们并不熟练,我不知道是否值得。它可能类似于
searchUtilityCommand | grep keyword | <awk modify grepped path> | xargs vim
有什么帮助吗?
谢谢!
答案1
还没有测试过,但没有理由它不起作用:
searchUtilityCommand | grep keyword | sed -e 's,$,/extra/path' | xargs vim
不过,我不得不说,我不知道如何摆脱这样运行 vim 时出现的“警告:输入不是来自终端”消息。(vim $(command pipeline)
出于这个原因,我通常更喜欢这样做)。
答案2
从 Vim 运行此 Ex 命令:
:args `=systemlist('searchUtilityCommand | awk ''/keyword/{print $0 "/extra/path"}''')`
或者这个:
:args `=map(filter(systemlist('searchUtilityCommand'), {_,v -> v =~# 'keyword'}), {_,v -> v.'/extra/path'})`
这应该用文件路径列表填充参数列表;由 输出的searchUtilityCommand
、匹配的keyword
、/extra/path
附加在末尾。
从那里你可以做各种各样的事情,例如:
" open each file in a horizontal split (run `:only` to close all splits except the current one)
:all
" 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