让我们假设在你的工作日中,你在bash中的某些命令中反复遇到以下形式的柱状输出(在我的例子中,是在我的Rails工作目录中执行svn st):

?       changes.patch
M       app/models/superman.rb
A       app/models/superwoman.rb

为了处理命令的输出(在本例中是文件名),需要进行某种解析,以便将第二列用作下一个命令的输入。

我一直在做的是使用awk来获得第二列,例如,当我想删除所有文件(不是说这是一个典型的用例),我会做:

svn st | awk '{print $2}' | xargs rm

由于我经常键入这个,一个自然的问题是:在bash中是否有更短(因此更酷)的方法来完成这个任务?

注意: 我问的本质上是一个shell命令问题,尽管我的具体示例是在svn工作流上。如果您觉得工作流很愚蠢,并建议采用另一种方法,我可能不会反对,但其他人可能会反对,因为这里的问题实际上是如何以尽可能短的方式在bash中获得第n列命令输出。谢谢:)


当前回答

看起来你已经有了一个解。为了使事情变得更简单,为什么不把命令放在bash脚本中(使用短名称),然后运行该脚本,而不是每次都输入“长”命令呢?

其他回答

注意,文件路径不必在svn st输出的第二列中。例如,如果你修改文件,并修改它的属性,它将是第三列。

查看可能的输出示例:

svn help st

示例输出:

 M     wc/bar.c
A  +   wc/qax.c

我建议删去前8个字符:

svn st | cut -c8- | while read FILE; do echo whatever with "$FILE"; done

如果你想100%确定,并且处理带有空格的花哨文件名,例如,你需要解析xml输出:

svn st --xml | grep -o 'path=".*"' | sed 's/^path="//; s/"$//'

当然,您可能希望使用一些真正的XML解析器,而不是grep/sed。

看起来你已经有了一个解。为了使事情变得更简单,为什么不把命令放在bash脚本中(使用短名称),然后运行该脚本,而不是每次都输入“长”命令呢?

你可以使用cut来访问第二个字段:

cut -f2

编辑: 对不起,我没有意识到SVN在输出中不使用选项卡,所以这有点没用。你可以裁剪输出,但它有点脆弱-像cut -c 10-可以工作,但确切的值将取决于你的设置。

另一个选项是:sed 's/.\s\+//'

如果你可以手动选择列,你可以非常快地使用pick:

svn st | pick | xargs rm

到第二列的任意单元格,按c,然后按enter

完成的事情与:

svn st | awk '{print $2}' | xargs rm

只使用bash可以使用:

svn st | while read a b; do rm "$b"; done

当然,它不是更短,但它更有效,它正确地处理文件名中的空白。