让我们假设在你的工作日中,你在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列命令输出。谢谢:)
注意,文件路径不必在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。
注意,文件路径不必在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。