我试图使用此命令从命令行在vim中打开多个文件。出于某种原因,我会得到一个错误,你将在下面看到。
$ find . -name edit.html.erb \
| perl -pi -e 's/^..//' \
| perl -pi -e 's/\n$/ /' \
| vim
当我在没有“| vim”的情况下运行它时,如此命令:
$ find . -name edit.html.erb \
| perl -pi -e 's/^..//' \
| perl -pi -e 's/\n$/ /'
获得此输出:
addresses/edit.html.erb claims/edit.html.erb emails/edit.html.erb owners/edit.html.erb packages/edit.html.erb users/edit.html.erb vessels/edit.html.erb voyages/edit.html.erb %
我收到的错误可能与输出末尾的“%”标记有关。
这是输出和错误:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
我该如何解决这个问题?不确定哪个部分导致错误,因为我是一个新手,但任何帮助将不胜感激!
答案 0 :(得分:9)
您正在将文件的内容作为键盘输入传递。我想你要做的是在文件打开的情况下启动vim
。我不知道vim
,但这通常是通过将文件名作为参数传递来实现的。
在bash中,人们会使用:
vim $( find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /' )
(删除了对-i
的无意义使用。)
实际上,将换行更改为空格是没用的,删除前导./
也是如此,所以您只需要:
vim $( find . -name edit.html.erb )
答案 1 :(得分:3)
让我们看一下vim的文档:
SYNOPSIS
vim [options] [file ..]
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]
这告诉我们,我们可以指定许多文件名作为命令行参数,-
表示将从STDIN加载“文件”。但这不是文件名,而是缓冲区内容!
让你的Perl脚本exec
使用正确的args进入vim。
exec "vim", @filenames;
或类似的。这将使你的工具链
$ find . -name edit.html.erb \
| perl -pi -e 's/^..//' \
| perl -ne 'chomp; push @files, $_; }{ exec "vim", @files'
(你真的确定要删除任何文件名的前两个字符吗?这就是s/^..//
的作用。转义点以匹配文字.
)
答案 2 :(得分:3)
管道输入vim
的标准输入将不会做任何事情(无论如何都有帮助)。您想要传递命令行参数,而不是输入。在bash
中,请使用反引号或$(...)
语法。
vim `find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /'`
vim $(find . -name edit.html.erb | perl -pe's/^..//' | perl -pe's/\n$/ /')
(Perl的-i
选项在这里也没有做任何事情。当您在命令行上提供文件名时,该选项用于“就地”编辑文件。)
答案 3 :(得分:1)
不要忘记辅助操作系统:vim
:args `find . -name edit.html.erb`
:argadd `find . -name edit.html.js`
甚至
:args **/edit.html.erb
(另见:argdelete,:args,:argdo等)
(其他答案几乎击败了使用某些文件名参数调用vim的其他路径)