从 svn 日志中提取已删除文件的名称

Extract names of deleted files from svn log

我需要提取在两次提交之间删除的文件名。我有这个命令:

svn log -r 1:30 -v | grep ' D ' | awk -F ' ' '{print }'

对于这个命令

svn log -r 28:30 -v 

输出为:

r28 | admin | 2017-08-08 10:02:03 +0000 (Út, 08 srp 2017) | 1 line
Changed paths:
   D /smartsvn-linux-9_2_1.tar.gz

Remove test file 1
------------------------------------------------------------------------
r29 | admin | 2017-08-08 10:02:21 +0000 (Út, 08 srp 2017) | 1 line
Changed paths:
   D /smartsvn-linux-9_2_1 (copy).tar.gz

Remove test file 2
------------------------------------------------------------------------
r30 | admin | 2017-08-08 10:02:52 +0000 (Út, 08 srp 2017) | 1 line
Changed paths:
   D /testfile.txt

Remove testing file 3

对于此命令:

svn log -r 28:30 -v | grep ' D ' 

输出为:

   D /smartsvn-linux-9_2_1.tar.gz
   D /smartsvn-linux-9_2_1 (copy).tar.gz
   D /testfile.txt

我想从那个输出中得到一个没有字母 D 的输出:

   /smartsvn-linux-9_2_1.tar.gz
   /smartsvn-linux-9_2_1 (copy).tar.gz
   /testfile.txt

它几乎可以正常工作,但如果文件名包含 space,它就不起作用。我明白为什么会这样,但我不知道,我该如何解决。或者有更好的方法,我该怎么做?

编辑:同时我解决了我的问题,但我确信它是垃圾。它有效,但我相信它存在更好的方法。我只会使用 grep 或 egrep,但我不知道 grep 或 egrep 是否支持组。

svn log -r 1:30 -v | grep ' D ' | egrep '/([a-zA-Z_.0-9\-\(\) -]+)$' -o

不需要grep,你可以用awk来实现grep能做到的。 使用 / D/ 过滤包含 D

的行

您可以使用awk从6开始打印[=18=]的子字符串(这是您想要的模式的起点)

$ svn log -r 28:30 -v | awk '/ D/{print substr([=10=],6)}'

或者您可以使用 sub(/[^/]*/ 过滤掉 non-/

$ svn log -r 28:30 -v | awk '/ D/{sub(/[^\/]*/,"",[=11=]);print [=11=]}'