将变量中捕获的多个文件名传递给命令(vim)

时间:2015-10-21 13:26:24

标签: bash vim grep

我正在尝试创建一个自动打开包含特定模式的任何文件的脚本。

这是我迄今取得的成就:

xargs -d " " vim < "$(grep --color -r test * | cut -d ':' -f 1 | uniq | sed ':a;N;$!ba;s/\n/ /g')" 

问题是vim不能将该命令识别为列表的单独文件,而是整个文件名:

zsh: file name too long: ..............

有没有简单的方法来实现它?我错过了什么?

3 个答案:

答案 0 :(得分:2)

调用xargs的常用方法是通过管道传递带换行符的参数:

grep -Rl test * | xargs vim

请注意,我还将-l参数传递给grep以列出包含我的模式的文件。

答案 1 :(得分:1)

使用此:

vim -- `grep -rIl test *`
  • -I跳过二进制文件中的匹配
  • -l首次匹配时打印文件名

尝试省略xargs,因为这会导致vim的行为不正确:

Vim: Warning: Input is not from a terminal

答案 2 :(得分:0)

我通常做的是将以下行附加到文件列表中:

> ~/.files.txt && vim $(cat ~/.files.txt | tr "\n" " ")

例如:

grep --color -r test * > ~/.files.txt && vim $(cat ~/.files.txt | tr "\n" " ")

我的.bashrc中有以下内容绑定VV(大写两次V)以自动插入:

insertinreadline() {
READLINE_LINE=${READLINE_LINE:0:$READLINE_POINT}$1${READLINE_LINE:$READLINE_POINT}
    READLINE_POINT=`expr $READLINE_POINT + ${#1}`
}
bind -x '"VV": insertinreadline " > ~/.files.txt &&  vim \$(cat ~/.files.txt | tr \"\\n\" \" \")"'