1

我需要在对 pom.xml 进行更改的 subversion 转储中找到所有修订。

我正在使用svndumptool成功打印修订,然后 sed 过滤这些发现。

我可以将修订号作为开始进行匹配,但是如果在找到停止之前找到第二个匹配的开始,我需要能够将其丢弃。

这是我正在使用的命令:

    svnDumpTool=~/path/to/svndumptool.py
    target=specificSvn.dump

    # use svndumptool to read the svnlog from target to stdin | 
    # sed then matches start -r[0-9], such as -r103, ends on pom.xml
    # then redirects stdout > to a log file for this target

    $svnDumpTool log $target -v | sed -n '/r[0-9]/,/pom.xml/p' > $target.log

考虑这样的日志:

    -r0 | ... | ...
    Changed paths:
    none; initialization of the repo; not my match
    -r1 | ... | ...
    Changed paths:
    ... not my matches here
    --------
    -r2 | ... | ...
    Changed paths:
    ... nor here
    --------
    -r3 | ... | ...
    Changed paths:
    pom.xml
    --------
    -r4 | ... | ...
    Changed paths:
    pom.xml
    --------
    -r5 | ... | ...
    Changed paths:
    ... changes may or may not be here
    --------

这是结果。

  1. 在第一次通过时,我得到的比我想要的要多:

    • 我会在 -r0 开始时得到一场比赛,
    • 来自 -r3 的 pom.xml 末尾的匹配,
    • 从头到尾打印所有内容,包括 -r0、-r1 和 -r2:

      -r0 | ... | ...
      Changed paths:
      none; initialization of the repo; not my match
      -r1 | ... | ...
      Changed paths:
      ... not my matches here
      --------
      -r2 | ... | ...
      Changed paths:
      ... nor here
      --------
      -r3 | ... | ...
      Changed paths:
      pom.xml
      
  2. 在第二遍时,我得到了我想要的:

    • 我会在 -r4 开始时得到一场比赛,
    • 来自 -r4 的 pom.xml 末尾的匹配:

      -r4 | ... | ...
      Changed paths:
      pom.xml
      

所以,我认为我需要做的是:

  1. 如果我找到一个开始,
  2. 我在找到匹配结束的表达式之前找到另一个表达式匹配开始,
  3. 然后扔掉第一个开始;否则打印。

我认为这篇文章可能有我的答案,但我尝试过的任何尝试都失败了。

编辑:自动更正让我明白了,当它应该是“pom.xml”时,我错误地将输出列为“Pom.xml”。

4

3 回答 3

1

我会用这种事情:

#!/usr/bin/env perl

use strict;
use warnings;

my $svnDumpTool = '~/path/to/svndumptool.py';
my $target      = 'specificSvn.dump';

my @rev = split /----*/, `$svnDumpTool log $target -v`;
foreach (@rev) {
  print if m/-r\d+[\s\S]*?Pom\.xml/;
}
于 2013-08-20T00:29:16.567 回答
1

Sed 在这里是错误的工具。你可以做到(sed 是图灵完备的),但它会变得不可读。

awk 可能会工作得更好。我不熟悉svndumptool;假设它--------在修订之间放置分隔符,您可以将其用作记录分隔符。GNU awk 允许正则表达式作为记录分隔符。

awk -v RS='--------\n' -v ORS='--------\n' '
  /^pom\.xml$/ { print }
'
于 2013-08-20T00:32:41.990 回答
1

这可能对您有用(GNU sed):

sed '/-r[0-9]/{h;d};H;/Pom.xml/!d;x' file

这会将开头的行-r[0-9]和之后的行存储在保持空间中,用较新的行覆盖那些已经在 HS 中的行,直到包含Pom.xml何时打印所有这些行的行。

于 2013-08-20T06:43:59.527 回答