2010-10-25 99 views
2

我想设置我的Bash文件,使得我可以从前一个命令的标准输出中抽取文本。我将使用的示例用例是在git rebase期间解决冲突。从前一个标准输出到文件命令行的洋文文件

$ git status 
# Not currently on any branch. 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  app/views/report/index.html.erb 
# 
$ vim app/views/report/index.html.erb 
# .... edit, resolve conflicts .... 
$ git add <Alt+.> 

的问题是最简单的方法来获取文件名的第二个命令(vim ...)是将我的手在鼠标。其中一个选项是screen,但是它有一组作为日常shell的问题。 (其中至少有一点是我使用并滥用Ctrl + A作为readline的快捷键)

从哪里开始为我做这项工作?理想情况下,我希望能够从前一个命令的标准输出中抽取第012行,以便将其作为命令处理。

回答

2

除了使用鼠标,我可以想到的唯一方法是使用grepsed和/或awk,或许与tee和/或击的功能和过程的取代和/或过程和/或命令替换:

vim $(git status | tee /dev/tty | grep ...) 

var=$(git status | tee /dev/tty | grep ...) 
vim "$var" 
git add "$var" 

tee让你看到完整的输出,同时捕捉修改后的输出。创建一个函数可以让你轻松地通过一个参数来选择某一行:

var=$(some_func 14) 
etc. 

缺点是你必须从一开始就这样做。我不知道在没有使用screen或其他一些输出日志记录和通过日志查找脚本的情况下执行此操作的任何方法。

+0

是啊,它变得很明显,我需要修改我的环境中捕捉到标准输出/标准错误,然后写的东西拉那些线在您的建议很好看,但我不知道。我如何从一个变量将这个从bash命令行中得到(例如,将内联变量扩展,或者更好,通过快捷键完成所有操作) – Shaun 2010-10-25 00:40:44

+0

@Shaun:你真的需要扩展它吗?你不能像我的例子那样引用变量吗?如果需要(可以同时进行其他扩展),可以按Ctrl-Alt-e在命令行上展开变量。在“man bash”中搜索“shell-expand-line”获取更多信息。不幸的是,readline函数不能以编程方式调用。 – 2010-10-25 02:23:55

+0

这很不幸 - 这比使用鼠标做更多的努力。我希望能够用我的方式编码,但看起来这不是一个没有修改Bash的选项。感谢你的回答。 – Shaun 2010-10-25 02:51:48

0

管通过输出的sed:

git status | sed -n '5p' 

获得5日线

1

我不知道一个良好的,干净的解决方案,但作为一个黑客,你可以尝试script命令,将所有输入和输出记录到文件中。对于GNU script

$ script -f 
Script started, file is typescript 
$ ls -1 
bar 
baz 
foo 
typescript 
$ echo $(tail -3 typescript | head -1) 
foo 
相关问题